是ASM框架的新手。我已经在这个ASM框架上工作了一个星期。我在网上看过关于解析类和从头开始生成.class文件的教程。 但我无法按照如何修改ASM中的现有类。
请帮帮我。
无法遵循ClassVisitor,ClassWriter和ClassReader之间的执行流程。
请通过为我提供以下代码的ASM示例来解决我的问题。
public class ClassName {
public void showOne()
{
System.out.println("Show One Method");
}
public static void main(String[] args) {
ClassName c=new ClassName();
c.showOne();
}
}
上述类应修改为:
public class ClassName {
public void showOne()
{
System.out.println("Show One Method");
}
public void showTwo()
{
System.out.println("Show Two Method");
}
public static void main(String[] args) {
ClassName c=new ClassName();
c.showOne();
c.showTwo();
}
}
修改它的ASM代码应该是什么?
我使用ASMifier工具生成代码。但我不知道在哪里应用它。
请帮帮我。 +
答案 0 :(得分:7)
您的要求有点不明确。下面是一个示例程序,它使用ASM的访问者API将假定具有问题结构的类转换为结果类。我添加了一个方便的方法,采用字节数组并返回一个字节数组。在这两种情况下都可以使用这种方法,静态转换应用于磁盘上的类文件以及Instrumentation代理。
将ClassWriter
与传递给ClassVisitor
的{{1}}组合如下时,它会自动复制源类的每个功能,因此您只需要覆盖所需的这些方法应用更改。
此处,ClassReader
会在遇到visitMethod
方法进行修改时被覆盖以进行拦截,并且会覆盖main
以附加全新的visitEnd
方法。 showTwo
会截取MainTransformer
指令(在您的示例中应该只有一个)将RETURN
之前的呼叫插入其中。
showTwo