2011-10-22 108 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/

相關問題