更改java .class文件而不编译

时间:2011-10-22 13:47:30

标签: java

有没有办法做到以下几点。所以我有一个project.jar文件,在里面我需要修改传递给某些方法的字符串,比如说classA.class。例如,假设这个classA.class有一个名为

的方法
change(String a, String b)

我想要的是将以下内容作为此方法内代码的第一行,如下所示:

a = a + "hi";

我想直接修改.class文件,而无需再次重新编译。然后我会用新的类文件更新jar文件。可能吗?如果有,任何人都可以举个例子吗?非常感谢!

3 个答案:

答案 0 :(得分:4)

是的,可以使用字节码编辑器。通常,您可以将aspectj与编译时编织一起使用来修改类文件。您还可以使用BCELcglib等库。

但是,对于您所描述的用例,通常不需要编辑类文件。您可以将对象包装在proxy中,或使用AoP编程风格修改其行为(例如aspectj支持

答案 1 :(得分:1)

有动态操作字节代码的工具,例如ASM:http://asm.ow2.org/

答案 2 :(得分:0)

另一种方式可能是仪器。在加载类时,您可以在使用之前操作字节码。有一些很好的库,例如来自jboss的javassist。我认为aspectJ的作用相似。

但为什么要更改字节码,编译并再次将其添加到jar文件中?你需要源代码吗?如果需要,也许可以使用一些反编译器来获取源代码。一个好工具是http://java.decompiler.free.fr/