1

我目前正在尝试了解 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某种方式使用我的回报。

4

2 回答 2

2

MethodRenamer.visitMethod() 返回的 MethodVisitor 是 ClassReader 用来填充方法体的。如果你想要一个空方法,那么你应该返回 null。请参阅相应的 JavaDoc

于 2011-10-27T14:37:19.330 回答
1

我也是第一次遇到这个问题。

阅读 ASM 教程时可能不清楚,因为有很多概念让您感到困惑。

我有一些建议供你学习。

一个例子:系统给你一本书,请你读一遍。编写阅读本书的方法是你的工作。每个人都有自己的阅读方法,也许你想快速阅读,忽略你不感兴趣的章节,也许你想仔细阅读并慢慢阅读。无论如何,你的工作就是制定一种方法来实现你阅读这本书的方式. 然后,您将这个读取方法提供给系统。系统获取您的方法并执行您在方法中分配的内容。这是回调的过程。我认为这对你最有帮助。

  • 然后,弄清访问者模式。设计模式在程序中的任何地方。我认为这就是 ASM 框架的工作原理。

  • 最后,转向 ASM 教程。

PS:

回答Shouldn't my class reader only read?

虽然被命名为 "ClassReader" ,但它的工作并不受读取字节码的限制。它将通过其他类调用其他方法,就像 MethodVisitor 一样,它负责方法中的仪器字节码。而且 MethodVisitor 那里只是一个回调。

可以帮助您更改字节码的 ASM 框架,远离面对字节码的细节。

于 2011-11-22T02:40:15.720 回答