簡體   English   中英

手動將方法調用添加到類文件中?

[英]Manually add a method call to a class file?

我需要手動將方法調用添加到類文件而不反編譯和重新編譯代碼,因為它依賴於數以千計的其他類,我不需要做更多的事情而不是nessescary。 我知道java,但不知道如何制作類文件。

任何幫助表示贊賞。

編輯:

我不是源代碼的所有者,我需要在任何計算機上工作,這意味着我無法重新分發源代碼並在我的修補程序工作時實時編譯它們。

您有源代碼,並且您已編譯所有其他類。 因此,您可以重新編譯該源文件,使用-classpath選項將編譯的類作為參數傳遞給java編譯器。

您應該使用ASMJavaassist來操作字節碼。 ASM有點復雜,需要您更多地了解JVM,但速度更快。 Javaassist不要求您了解JVM的內部結構。

但是,我不明白為什么你不能只重新編譯那個單一的源文件? 如果您只需要添加一次此方法,那么學習ASM或Javaassist的效率非常低。

子類化怎么樣? 然后你不需要觸摸源。

因此,如果您有源代碼並且只想將一些方法添加到一個類中。 然后你不必擔心其他類,即使它們依賴於你當前修改的類。 重新編譯文件不會影響其他類。 由於輸出將在運行時生成。

如果您的類未聲明為final並且您感興趣的方法不是final ,則可以擴展該類並僅覆蓋該方法。

只需更改源代碼,重新編譯! 一切都會好起來的。 Subclassing將不起作用。因為在您更改其代碼以使用新的subclass而不是舊的superclass subclass之前,已有的類將不知道新的subclass superclass

對於類文件的手動編輯,我推薦Krakatau (披露,我寫了)。 它允許您反匯編類文件,編輯它並重新組裝。 還有其他匯編程序,但AFAIK,Krakatau是唯一支持類文件格式中所有奇怪邊緣情況的匯編程序。

主要的警告是默認情況下Krakatau不保留某些可選的調試屬性(特別是LineNumberTable,LocalVariableTable和LocalVariableTypeTable),因為沒有簡單的方法以人類可編輯的格式表示它們,並且在字節碼更改時無法編輯它們導致驗證錯誤。 很可能你實際上並不需要這個,所以它應該沒關系。

另一個警告當然是你必須理解字節碼。 但是如果你不這樣做,你無論如何都無法手動編輯類文件。

我現在明白了! 我創建了具有相同名稱/方法的虛假源文件,但除了類和方法名稱之外沒有添加任何其他內容。 這樣我只需要打包直接鏈接到我的類文件的那些。 但現在編譯需要幾毫秒,而過去需要大約124秒,哈哈。 效果很好!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM