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

这些分别是 dmuldreturn 的操作码,所以它正在遍历代码,但它没有通过 visitInsnvisitInsn 报告 dload_0 指令visitLdcInsn.

我做错了什么?

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

(根据 Holger 的评论进行编辑。)