ASM 不报告恒定指令



我正在尝试使用 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

这些分别是dmuldreturn的操作码,因此它正在遍历代码,但它不会按visitInsnvisitLdcInsn报告dload_0指令。

我做错了什么?

ASM 将dload_0扩展到dload 0。同时,在写入时,ASM将字节码指令优化回写入ClassWriter时的快捷方式常数。覆盖visitVarInsn,您将看到输出,其中字节码作为第一个参数,变量索引作为第二个参数。

(根据霍尔格的评论编辑。

最新更新