有没有办法做到以下几点。所以我有一个project.jar文件,在里面我需要修改传递给某些方法的字符串,比如说classA.class。例如,假设这个classA.class有一个名为
的方法change(String a, String b)
我想要的是将以下内容作为此方法内代码的第一行,如下所示:
a = a + "hi";
我想直接修改.class文件,而无需再次重新编译。然后我会用新的类文件更新jar文件。可能吗?如果有,任何人都可以举个例子吗?非常感谢!
答案 0 :(得分:4)
是的,可以使用字节码编辑器。通常,您可以将aspectj
与编译时编织一起使用来修改类文件。您还可以使用BCEL
,cglib
等库。
但是,对于您所描述的用例,通常不需要编辑类文件。您可以将对象包装在proxy
中,或使用AoP编程风格修改其行为(例如aspectj
支持
答案 1 :(得分:1)
有动态操作字节代码的工具,例如ASM:http://asm.ow2.org/
答案 2 :(得分:0)
另一种方式可能是仪器。在加载类时,您可以在使用之前操作字节码。有一些很好的库,例如来自jboss的javassist。我认为aspectJ的作用相似。
但为什么要更改字节码,编译并再次将其添加到jar文件中?你需要源代码吗?如果需要,也许可以使用一些反编译器来获取源代码。一个好工具是http://java.decompiler.free.fr/。