2011-10-22 107 views
3

有没有办法做到以下几点。所以我有一个project.jar文件,里面我需要修改传递给我们说classA.class的一些方法的字符串。例如,让我们说这个classA.class有一个名为在不重新编译的情况下更改java的.class文件

change(String a, String b) 

什么,我都希望是做下面的代码的这种方法里面的第一线如下方法:

a = a + "hi"; 

我希望直接修改.class文件,而无需重新编译所有内容。那么在那之后我会用新的类文件更新jar文件。可能吗?如果是的话,任何人都可以举个例非常感谢提前!

+0

为什么编译时间并且不改变行为运行时?这样,您至少可以在必要时升级jar。 AspectJ可以执行运行时和编译时编织。 – extraneon

回答

4

是它可能与字节代码编辑器。通常,您可以使用aspectj和编译时编织来修改类文件。您也可以使用库,如BCEL,cglib等。

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

0

另一种方式可能是仪器仪表的。当你加载类时,你可以在使用它之前操作字节码。有一些很好的库,例如jboss的javassist。我认为aspectJ的工作原理类似。

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

相关问题