2013-06-26 27 views
0

我們在外部庫中包含了一部分功能,並將其附加到我們的項目中。該庫不能以任何方式更改。其中有兩類:com.myorg.Grandpacom.myorg.Dad,延伸com.myorg.Grandpa。還有com.myorg.Grandson延伸com.myorg.Dad和一些其他類擴展com.myorg.Grandpa以外的類。使IDE類具有比IDEA中的庫更高的編譯優先級

我反編譯com.myorg.Grandpa類,並添加一個新的方法new_method()它。 然後,我嘗試在com.myorg.Grandson中使用new_method(),但IDEA不會讓我這樣做,因爲孫子延伸了爸爸,它擴展了圖書館的爺爺,它不包含new_method()。 我試圖從庫中刪除爺爺,令人驚訝的是IDEA沒有說一個字,併成功地編譯了一個項目,儘管在圖書館的邊界,父親擴展了非現有的類。

問題是如何強制爸爸擴大一個新的爺爺而不刪除庫內的一個?

+0

OT:你的模型看起來有點奇怪。爸爸是'爺爺,然後是孫子'是'爸爸'。這真的是你的意圖嗎? – maba

回答

0

你可以

  • 添加DadGrandSon之間的抽象類:擴展Dad,並在子類中添加你的方法。然後從該子類派生GrandSon

  • Dad的一個實例放入一個新類中,並讓您的IDE爲彙總的Dad實例創建委託方法。再次將您的新方法添加到新類中。

還有另一種可能性:

  • 如果您需要修改類到位,使用aspectj代碼編織:AspectJ的改變字節碼(它不需要源代碼)在運行時。這樣您可以添加方法或字段。
0

事實是,您正在使用完整軟件包簽名複製類,因此您將獲得類加載器首先加載的類。我知道在Websphere中你可以調整類加載器的優先級,但在你的情況下不能說。

無論如何,爲什麼不直接做反編譯?您正在通過反編譯/定製讓自己難以與外部庫和不良實踐(可能是版權問題)耦合。此外,如果圖書館得到更新,您將不得不重建您的定製課程。

選項:

創建自己的實現,例如:

  1. 創建複製在爺爺的所有方法加上你需要一個接口。

  2. 擴展Grandpa類並從您的界面實現添加的方法,所有其他方法將保持不變。

  3. 從你自己的類hierarchie中擴展所有其他擴展類。

  4. 而不是使用庫通用類的,用你的接口作爲命名

這樣,你是那種創建自己的界面庫,如果它的變化,你知道在哪裏做出改變。

你甚至可以在沒有界面的情況下完成它,它是一種包裝功能,它取決於你需要實現的功能。

無論如何,我會嘗試通過自己的代碼解決它,而不是通過搞亂圖書館,它是不值得做這樣的技巧,如果一個新的程序員接受該項目,他們將需要很多時間找出爲什麼以及如何表現。

現在,如何構建類hierarchie可能會有所不同,但它取決於您需要的具體實現,因此您需要發佈有關庫的內容以及要嘗試的內容的更詳細的數據添加到它,如果你期望一些更具體的答案...

Regards

相關問題