繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM