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中发生类加载时(调用类访问者的地方?)或者在类对象上调用方法时
我对此感到困惑
# 1 楼答案
通常,您会将这样的
ClassVisitor
链接到ClassReader
,它读取给定的类并触发所有visit*
方法何时阅读类(并打印方法名)完全取决于您
然而,如果您想转换一个类并将其加载到JVM中,一种可能性是将^{} 子类化,在那里读取该类,转换它(通过使用
visit*
方法),并使用ClassWriter
编写它。请参阅一些代码示例中的ASM的examples
文件夹(例如Annotations.java
)# 2 楼答案
visitMethod
在您直接或间接呼叫访客时被调用。这与JVM中的类加载或执行完全无关ASM使用访客模式。您传入一个实现您感兴趣的回调的类,然后将其传递给
ClassNode.accept(cv)
之类的对象,类节点将自动调用您对类文件适当部分的所有回调