java - 在asm中什么时候会调用ClassVisitor的visitMethod?

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

假设我有这样的类(class):

public class ClassPrinter extends ClassVisitor {


    public ClassPrinter(ClassWriter writer) {
        super(Opcodes.ASM5, writer);
    }

    @Override
    public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
        super.visit(version, access, name, signature, superName, interfaces);
    }

    @Override
    public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
        // when this line will get executed?
        System.out.println(name);
    }

}

现在何时调用visitMethod?是在 Java 中发生类加载时(即类访问者被调用的地方?)还是在类对象上调用方法时?

我对此感到困惑。

最佳答案

当您直接或间接调用访问者时,

visitMethod 将被调用。这与 JVM 中的类加载或执行完全无关。

ASM 使用访问者模式。您传入一个实现您感兴趣的回调的类,然后将其传递给类似 ClassNode.accept(cv) 的类,ClassNode 将自动调用类文件相应部分的所有回调.

关于java - 在asm中什么时候会调用ClassVisitor的visitMethod?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35317692/

相关文章:

Java 客户端只接收来自 C 服务器的第一个响应

c# - 单元测试委托(delegate)方法

java - 如何在运行时复制 Java 类?

javascript - Rhino 编译器的编程接口(interface)?

java - 如何重用asm中methodNode的原始帧信息来创建 `org.objectweb.asm.tree.analysis.Frame`

java - 按升序显示三个非负整数

java - 解析 MMMM YYYY 格式的日期

java - 如何使用 ASM 为初始值设定项添加静态最终字段?

java - ASM 参数编号

java - 如何使用 ASM 读取 lambda 表达式字节码