我目前正在尝试了解ASM库的工作原理。我决定尝试重命名给定类的所有方法,所以我写了一个迷你MethodRenamer
访问者:
class MethodRenamer extends ClassAdapter {
public MethodRenamer(ClassVisitor cv) {
super(cv);
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
MethodVisitor methodVisitor = cv.visitMethod(access, name+"_new", desc, signature, exceptions);
return methodVisitor;
}
}
它实际上让我完整的工作,但我无法理解为什么。我认为,对于给定的代码,它只对每个方法m
创建一个m_new
方法,没有代码。但与我的期望相反,它以某种方式用原始代码填充每个m_new
。
这怎么可能发生?我认为只有我转发到cv
的内容才会写入输出文件中。我没有在任何地方告诉cv
原始m
代码的代码是什么。所以我想这里肯定会有其他东西在进行?唯一可行的选择似乎是它以某种方式使用我返回的methodVisitor
。
答案 0 :(得分:2)
MethodRenamer.visitMethod()返回的MethodVisitor是ClassReader用来填充方法体的MethodVisitor。如果你想要一个空方法,那么你应该返回null。请参阅corresponding JavaDoc。
答案 1 :(得分:1)
我第一次也遇到过这个问题。
在阅读ASM教程时可能不太清楚,因为有很多概念让你感到困惑。
我有一些建议让你学习。
一个例子:系统为您提供一本书,请您阅读。写一本阅读本书的方法是你的工作。每个人都有自己的阅读方法,也许你想快速阅读,忽略你不感兴趣的章节,也许你想仔细阅读和慢。无论如何,你的工作是制定一个方法,实现你如何阅读本书。然后,将此读取方法提供给系统。系统获取您的方法并执行您在方法中指定的操作。这是回调的过程。我认为这对你最有帮助。
然后,明确visitor pattern。设计模式在程序的任何地方。这就是我认为ASM框架如何运作的方式。
最后,转到ASM教程。
PS:
回答Shouldn't my class reader only read?
虽然被命名为" ClassReader" ,通过读取字节码,其工作不受限制。它将通过其他类调用其他方法,就像MethodVisitor一样,它负责方法中的仪器字节码。而MethodVisitor只有一个回调。
ASM框架可以帮助您更改字节码,远离面对字节码的细节。