2015-12-17 56 views
5

這裏有趣的問題。因此,我收到了一個.jar文件,它被混淆了,這意味着當我反編譯.class文件時,它不會顯示100%完美,因此我無法重新編譯它。然而,我需要改變的唯一方法已經完美地轉換了(但類沒有))。有沒有辦法以某種方式更改.java代碼並注入替換類文件中的方法,而無需完全重新編譯?替換已編譯的.class文件中的方法

如果這個失敗即時轉到字節碼。

謝謝!

編輯:作爲後續問題/或圍繞替換整體方法的黑客。我真的只是試圖改變方法在本地生成的變量。如果有更好的方法來做到這一點。

+1

如果您的代碼是該庫的使用者,那麼可以在代碼中擴展該類,然後覆蓋所需的方法? – Manish

+1

可能的重複:http:// stackoverflow。com/questions/5191888 /如何改變方法在類文件中不需要重新編譯 –

+0

我想我忘了提到的一件事是我反映了這個代碼,並沒有將它用作庫。所以我真的不需要「使用」這個代碼。我只想在文件中替換這個方法,以便我不必反映類中的所有字段並手動將它重載。 – k9b

回答

2

取決於你真正想做的事,我不推薦反編譯/修改/重新編譯代碼(無論是法律,修的,可理解性,可測性的原因。)

字節碼操作可能不是最好的解決方案,但如果你想按照這種方式看看ASM project,這是一個廣泛使用的字節碼操作框架,許多已知的項目。

如果我是你,我會先嚐試一些方面(AspectJ)。方面的力量是你不會觸摸現有的代碼,但告訴虛擬機在/之前/之後/取代調用一個特定的方法。它允許您指出確切的上下文並進行更改,通過以分離方式編寫自己的代碼來增強代碼的行爲。

希望它有幫助。

0

對不起,這不是一個答案,但它是一個評論太長......

我反映這一代碼,而不是使用它作爲一個庫。所以我真的不需要「使用」這個代碼(也就是我只是在運行時反射和調用函數)。

我會使用代碼調用「運行時反射和調用函數」。

可能有這樣做的原因,但如果可能的話,我寧願簡單地調用函數作爲庫函數(如果可以使用反射來做同樣的事情,這應該是可能的)。

...並手動超載它。

沒有什麼比這更簡單的擴展類並覆蓋「錯誤」的方法。就我的理解而言,即使你想「注入」這個方法,你也必須有代碼。你將如何測試這樣的代碼?只是擴展課程會容易得多...你能否更詳細地指定你想要達到的理由,以及爲什麼你不能使用我上面寫的內容?

0

如果你想改變只是一種方法,你可以實際上extend類,然後@Override的方法! 不知道這是否是完美的方式,但它的工作原理!

相關問題