2009-09-14 12 views

回答

9

僅使用 Java可以嗎?

簡單的答案是強調「你不想那麼做!」。

這在技術上是可行的,但並非沒有訴諸非常複雜,昂貴和脆弱的技巧,如字節碼修改。即使如此,你也必須依靠動態加載來訪問修改後的類型和(可能)反射以利用其新成員。總之,你會爲自己創造很多痛苦,如果有什麼收穫的話,你會得到很多痛苦。

Java是靜態類型語言,添加/修改類類型簽名可以打破類的靜態類型合同。


1 - AspectJ和等等讓你注入額外行爲變成一個類,但它可能不是「運行」注射液,你是後。當然,注入的方法將不能用於靜態編譯的代碼調用。

+1

Downvoter - 請解釋。 – 2014-12-02 23:43:38

1

所以,如果你真的瘋了,你可以做些什麼,如他們概述here。你可以做的是加載.java文件,找到正確的插入點,添加你需要的任何方法,調用java編譯器並重載類。祝你好運調試混亂雖然:)

編輯This實際上可能是一些使用...

1

是否有可能通過使用Java只是在做什麼?

的確如此,「唯一」的東西,你所要做的就是定義一個instrumentation agent其提供適當的ClassFileTransformer,你將不得不使用反射來調用添加的方法。然而,這不是你想要做的,但它是可行的,並且有一個明確定義的界面。如果你想修改現有的方法,你可能會對AspectJ感興趣。

0

儘管可能,但它沒有用。

你將如何訪問這些新的領域和方法?

如果你想要的是添加的「屬性」的可能性,你不能直接使用這些方法和字段(如「普通」字段和方法),因爲他們不會被編譯。

和「方法」中,可以使用Map<String, Object>作爲「動態屬性」,使用Map<String, SuitableInterface>作爲「動態方法」,然後按名稱查找它們。

如果您需要Java的擴展語言,可以添加嵌入式動態語言(如Javascript或Groovy);其中大部分可以訪問任意的java對象和方法。

1

你可以用AOP做一些非常時髦的事情,雖然在運行時真正修改類是一個相當多毛的技術,需要大量的類加載魔法和魔術。

更容易的是使用AOP技術來生成目標類的子類,並向其中引入新方法,而不是稱爲「混入」或「引入」的AOP。請參閱here以瞭解Spring AOP如何實現它,但與您實際嘗試實現的內容相比,這可能相當蹩腳。