ASM 不报告常量指令
ASM not reporting constant instructions
我正在尝试使用 ASM 库读取字节码并将其转换为不同的格式。从包含此方法的简单测试 class 开始:
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
的操作码,所以它正在遍历代码,但它没有通过 visitInsn
或 visitInsn
报告 dload_0
指令visitLdcInsn
.
我做错了什么?
ASM 将 dload_0
扩展为 dload 0
。同时,在写的时候,ASM将字节码指令优化回写成ClassWriter
时的快捷常量。覆盖 visitVarInsn
,您将看到字节码作为第一个参数,变量索引作为第二个参数的输出。
(根据 Holger 的评论进行编辑。)
我正在尝试使用 ASM 库读取字节码并将其转换为不同的格式。从包含此方法的简单测试 class 开始:
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
的操作码,所以它正在遍历代码,但它没有通过 visitInsn
或 visitInsn
报告 dload_0
指令visitLdcInsn
.
我做错了什么?
ASM 将 dload_0
扩展为 dload 0
。同时,在写的时候,ASM将字节码指令优化回写成ClassWriter
时的快捷常量。覆盖 visitVarInsn
,您将看到字节码作为第一个参数,变量索引作为第二个参数的输出。
(根据 Holger 的评论进行编辑。)