标签: bytecode

java记录紧凑构造函数字节码

我正在将一个简单的类转换为一条记录,如下所示:

public class Mine {
    private final String name;
    public Mine(String name) {
        this.name = name == null ? "a" : name;
    }
}
Run Code Online (Sandbox Code Playgroud)

本能地,我是这样写的:

public record Mine(String name) {
    public Mine {
        this.name = name == null ? "a" : name;
    }
}
Run Code Online (Sandbox Code Playgroud)

无法编译:cannot assign a value to final variable name.

我有点困惑,因为这个紧凑的构造函数有效:

    public Mine {
        name = name == null ? "a" : name;
    }
Run Code Online (Sandbox Code Playgroud)

我无法真正理解发生了什么,所以我决定查看字节码:

         0: aload_0
         1: invokespecial #1                  // Method java/lang/Record."<init>":()V
         4: aload_1
         5: …
Run Code Online (Sandbox Code Playgroud)

java bytecode record java-17

2
推荐指数
1
解决办法
1194
查看次数

Java,最昂贵的陈述?

Java编程语言中最昂贵的(字节码和cpu周期)语句是什么?

java optimization bytecode micro-optimization

1
推荐指数
2
解决办法
1030
查看次数

bootclasspath中javaagent jar的位置

我有一个javaagent jar,我把它放在bootclasspath上

Boot-Class-Path: myagent.jar
Run Code Online (Sandbox Code Playgroud)

在MANIFEST.MF文件中.

我需要找到jar所在文件系统的目录.

然而,这里描述的方法似乎并不适合我:

 new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().g­etPath());
Run Code Online (Sandbox Code Playgroud)

在这种情况下,ProtectionDomain.getCodeSource()返回null.我想这种情况正在发生,因为jar已被放在引导类路径中.因此,我也无法通过MyClass.getClassLoader()来获取资源位置.

我使用的是Java 6.

任何人都可以告诉如何获得罐子的位置?

java instrumentation bytecode classloader javaagents

1
推荐指数
1
解决办法
3373
查看次数

如果没有mem2reg,为什么优化传递不起作用?

为什么我必须在字节码优化中执行此mem2reg传递以获得另一个优化传递结果?mem2reg有什么用?

opt -dce myfile.bc
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我没有改变输出代码

opt -mem2reg -dce myfile.bc
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,我对输出代码进行了更改

编辑:LLVR IR仍然是SSa形式,不是吗?使用mem2reg我应该有一个"修剪"的SSA表格,是吗?

optimization bytecode llvm

1
推荐指数
1
解决办法
2785
查看次数

在dex文件中混淆了smali代码和dalvik字节码规范以及操作码的实际十六进制

我定义了一个名为的java类DefineFields.它有一个空构造函数.当我编译它时,classes.dex文件中的十六进制代码显示如下:

7010 050C 0000 0E00 (show in little endian)
Run Code Online (Sandbox Code Playgroud)

之后,我搜索字节码规范,我发现它

(spec code)                      (hex of dex) 
  70 35c: invoke-direct           (7010)     
  05 22x: move-wide/from16        (050C)
  00 10x: nop                     (0000)
  0E 10x: return-void             (0E00)
Run Code Online (Sandbox Code Playgroud)

我读了规范.但我不能完全理解是什么35c.(我知道c,x在规范中有解释表.)更多我想知道的是我如何解释1070100C中的十六进制050C

这些东西与规范操作码不匹配.

bytecode dalvik dex smali

1
推荐指数
1
解决办法
1046
查看次数

使用ASM结果修改方法体"在"期间超出最大堆栈大小"

我想用新内容替换方法体(sample.class:sayHello方法),然后执行sample.class.原来的sayHelo声明是:

    public int sayHello(String args){

}
Run Code Online (Sandbox Code Playgroud)

我想修改它的主体:

    System.out.println("sxu says: hello world!");
    return 1;
Run Code Online (Sandbox Code Playgroud)

但是样例执行结果抛出异常:

Exception in thread "main" java.lang.VerifyError: Operand stack overflow
Exception Details:
  Location:
    code/sxu/demo/data/sample.sayHello(Ljava/lang/String;)I @4: ldc
  Reason:
    Exceeded max stack size.
  Current Frame:
    bci: @4
    flags: { }
    locals: { 'code/sxu/demo/data/sample', 'java/lang/String' }
    stack: { 'code/sxu/demo/data/sample', 'java/io/PrintStream' }
  Bytecode:
    0000000: 2ab2 0028 122a b600 1704 acb2 0028 2bb6
    0000010: 0017 04ac    
Run Code Online (Sandbox Code Playgroud)

我使用asm工具,我的代码中有三个java类:

public class Adapt extends ClassLoader {

    @Override
    protected synchronized Class<?> loadClass(final String name,
            final boolean resolve) …
Run Code Online (Sandbox Code Playgroud)

java bytecode bytecode-manipulation java-bytecode-asm

1
推荐指数
1
解决办法
1960
查看次数

在使用泛型时,javac编译器是否为每种类型创建了不同的类?

如果我有一个泛型类,编译器是否为我使用它的每个类型创建了一个不同的类?让我们考虑一下Class<T>.如果我创建类型的两个实例Class<Integer>Class<String>,该编译器创建两个不同的类别?

如果答案是否定的:扩展泛型类的类如何可以继承具有不同类型(来自单个类)的相同方法或属性.

另一个问题:为什么我不能var instanceof Class<Integer>使用参数化类型而不是ClassClass<?>

如果我尝试这样做,我会收到以下错误:"无法对参数化类型执行instanceof检查Test<Integer>.请改用表单,Test<?>因为在运行时将删除更多泛型类型信息"

你能给我更多关于仿制药的信息吗?

java compiler-construction generics bytecode class

1
推荐指数
1
解决办法
393
查看次数

Java中私有内部类的访问标志 - 与反射API不一致的规范?

我在理解Java中内部类的访问标志(特别是私有)的使用时遇到了问题.我在字节代码中找到的标志似乎与反射API提供的信息不一致.

我附上以下程序来说明问题.该程序有一个私有内部类,并使用三种不同的方法进行自我分析:

  1. 使用JClassLib检查类文件,并将访问标志与JVM Spec中的def进行比较
  2. 使用反射API
  3. 使用ASM 5.0

令人惊讶的是,这给出了不同的结果,这是输出:

inner class is private (inspection): false
inner class is private (reflection): true
inner class is private (ASM): false
Run Code Online (Sandbox Code Playgroud)

有谁知道这里发生了什么?下面是复制问题的代码,我在Mac上使用了JRE build 1.8.0_05-b13来运行它.

import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Opcodes;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Modifier;
public class TestModifiers {
// this is the class to be tested
private class InnerClass {}
public static void main(String[] args) throws Exception {
    // check whether class is private using inspection, and comparison with …
Run Code Online (Sandbox Code Playgroud)

java jvm bytecode

1
推荐指数
1
解决办法
511
查看次数

为什么javac有时会创建不必要的变量副本?

我的代码看起来像这样:

boolean[] array = new boolean[200];
int[] indexes = {10, 42, 62, 74};
while(true) {
    //some code here
    StringBuilder sb = new StringBuilder();
    for (int j : indexes) {
        sb.append(array[j] ? '1' : '0');
    }
}
Run Code Online (Sandbox Code Playgroud)

字典代码:

ASTORE 3 //"indexes" array
...
ALOAD 3
ASTORE 8
ALOAD 8
ARRAYLENGTH
...
Run Code Online (Sandbox Code Playgroud)

我不确定为什么javac复制引用数组到另一个本地var.

java bytecode javac

1
推荐指数
1
解决办法
72
查看次数

字节,短类型的好处

操作数堆栈的最小槽大小和局部变量表槽大小为"int".

那么我们如何获得将变量声明为short,byte等的好处.

java bytecode

1
推荐指数
1
解决办法
120
查看次数