麻烦理解方法用Java中的ASM字节码重命名

时间:2011-10-27 09:37:35

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

我目前正在尝试了解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

2 个答案:

答案 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框架可以帮助您更改字节码,远离面对字节码的细节。