java - ASM 不报告常量指令

标签 java jvm java-bytecode-asm bytecode-manipulation jvm-bytecode

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

这些分别是 dmuldreturn 的操作码,因此它正在遍历代码,但它也没有报告 dload_0 指令通过 visitInsnvisitLdcInsn

我做错了什么?

最佳答案

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

(在 Holger 评论后编辑。)

关于java - ASM 不报告常量指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59869384/

相关文章:

java - 为什么 Java 编译器内联访问非静态最终字段?

garbage-collection - JRuby-如何启动垃圾收集器?

java - ASM 方法访问者可以与接口(interface)一起使用吗?

java - 如何在 Jersey REST 方法中使用可选数量的参数?

java - NoClassDefFound错误: AmazonSNSClient in Java SDK

java - jvm优化可以改变指令顺序吗?

java - 方法代码太大!使用 ASM 异常

java - 如何创建一个 ASM LdcInsnNode 将当前类静态添加到堆栈中?

java - SpringMVC 3 和 Tiles 2 页面标题的本地化

java - Struts 2 动态参数绑定(bind)