如何使用ASM 4.0修改Java字节码

时间:2014-08-29 05:22:56

标签: java bytecode java-bytecode-asm

是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工具生成代码。但我不知道在哪里应用它。

请帮帮我。 +

1 个答案:

答案 0 :(得分:7)

您的要求有点不明确。下面是一个示例程序,它使用ASM的访问者API将假定具有问题结构的类转换为结果类。我添加了一个方便的方法,采用字节数组并返回一个字节数组。在这两种情况下都可以使用这种方法,静态转换应用于磁盘上的类文件以及Instrumentation代理。

ClassWriter与传递给ClassVisitor的{​​{1}}组合如下时,它会自动复制源类的每个功能,因此您只需要覆盖所需的这些方法应用更改。

此处,ClassReader会在遇到visitMethod方法进行修改时被覆盖以进行拦截,并且会覆盖main以附加全新的visitEnd方法。 showTwo会截取MainTransformer指令(在您的示例中应该只有一个)将RETURN之前的呼叫插入其中。

showTwo