我正在尝试使用 ASM 库来读取字节代码并将其转换为不同的格式。从包含此方法的简单测试类开始:
public static double square(double a) {
return a * a;
}
它编译成这个字节代码:
public static double square(double);
Code:
0: dload_0
1: dload_0
2: dmul
3: dreturn
使用这个MethodVisitor来读取代码:
return new MethodVisitor(ASM7) {
@Override
public void visitInsn(int opcode) {
System.out.println(String.format("%02x", opcode));
}
@Override
public void visitLdcInsn(Object value) {
System.out.println(value);
}
};
我得到这个输出:
6b
af
这些分别是 dmul
和 dreturn
的操作码,因此它正在遍历代码,但它也没有报告 dload_0
指令通过 visitInsn
或 visitLdcInsn
。
我做错了什么?
最佳答案
ASM 将 dload_0
扩展为 dload 0
。同时,在写入时,ASM 将字节码指令优化回写入 ClassWriter
时的快捷常量。覆盖 visitVarInsn
,您将看到输出,其中字节代码作为第一个参数,变量索引作为第二个参数。
(在 Holger 评论后编辑。)
关于java - ASM 不报告常量指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59869384/