有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java何时在asm中调用ClassVisitor的visitMethod?

假设我有这样的课:

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中发生类加载时(调用类访问者的地方?)或者在类对象上调用方法时

我对此感到困惑


共 (2) 个答案

  1. # 1 楼答案

    通常,您会将这样的ClassVisitor链接到ClassReader,它读取给定的类并触发所有visit*方法

    ClassReader cr = new ClassReader(className);
    cr.accept(new ClassPrinter(), 0);
    

    何时阅读类(并打印方法名)完全取决于您

    然而,如果您想转换一个类并将其加载到JVM中,一种可能性是将^{}子类化,在那里读取该类,转换它(通过使用visit*方法),并使用ClassWriter编写它。请参阅一些代码示例中的ASM的examples文件夹(例如Annotations.java

  2. # 2 楼答案

    visitMethod在您直接或间接呼叫访客时被调用。这与JVM中的类加载或执行完全无关

    ASM使用访客模式。您传入一个实现您感兴趣的回调的类,然后将其传递给ClassNode.accept(cv)之类的对象,类节点将自动调用您对类文件适当部分的所有回调