[英]Trouble understanding method renaming with ASM Bytecode in Java
我目前正在尝试了解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
。
从MethodRenamer.visitMethod()返回的MethodVisitor是ClassReader用来填充方法体的MethodVisitor。 如果要使用空方法,则应返回null。 参见相应的JavaDoc 。
我也是第一次遇到这个问题。
阅读ASM教程时可能不清楚,因为有很多概念使您感到困惑。
我有一些建议供你学习。
一个例子:系统为您提供一本书,请您仔细阅读。 编写一种阅读本书的方法是您的工作。 每个人都有自己的阅读方法,也许您想快速阅读,忽略您不感兴趣的章节,也许您想仔细阅读和慢读。无论如何,要做一个实现阅读本书方式的方法是您的工作。 。 然后,将此读取方法提供给系统。 系统获取您的方法并执行您在方法中分配的操作。 这是回调的过程。我认为这对您有最大的帮助。
然后,明确访客模式 。 设计模式在程序的任何地方。 我认为这就是ASM框架的工作原理。
最后,转到ASM教程。
PS:
答案Shouldn't my class reader only read?
尽管命名为“ ClassReader”,但其工作不受读取字节码的限制。 它将通过其他类调用其他方法,就像MethodVisitor一样,它负责方法中的仪器字节码。 而且MethodVisitor只是一个回调。
ASM框架可以帮助您更改字节码,远离面对字节码的细节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.