我正在尝试使用 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
使用此方法访问者读取代码:
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
或visitLdcInsn
报告dload_0
指令。
我做错了什么?
ASM 将dload_0
扩展到dload 0
。同时,在写入时,ASM将字节码指令优化回写入ClassWriter
时的快捷方式常数。覆盖visitVarInsn
,您将看到输出,其中字节码作为第一个参数,变量索引作为第二个参数。
(根据霍尔格的评论编辑。