有沒有什麼方法可以在運行時將新方法和屬性注入類中?在運行期間將新方法和屬性注入類
http://nurkiewicz.blogspot.com/2009/09/injecting-methods-at-runtime-to-java.html聲明我們可以使用Groovy來做到這一點。
僅使用Java就可能嗎?
有沒有什麼方法可以在運行時將新方法和屬性注入類中?在運行期間將新方法和屬性注入類
http://nurkiewicz.blogspot.com/2009/09/injecting-methods-at-runtime-to-java.html聲明我們可以使用Groovy來做到這一點。
僅使用Java就可能嗎?
僅使用 Java可以嗎?
簡單的答案是強調「你不想那麼做!」。
這在技術上是可行的,但並非沒有訴諸非常複雜,昂貴和脆弱的技巧,如字節碼修改。即使如此,你也必須依靠動態加載來訪問修改後的類型和(可能)反射以利用其新成員。總之,你會爲自己創造很多痛苦,如果有什麼收穫的話,你會得到很多痛苦。
Java是靜態類型語言,添加/修改類類型簽名可以打破類的靜態類型合同。
1 - AspectJ和等等讓你注入額外行爲變成一個類,但它可能不是「運行」注射液,你是後。當然,注入的方法將不能用於靜態編譯的代碼調用。
是否有可能通過使用Java只是在做什麼?
的確如此,「唯一」的東西,你所要做的就是定義一個instrumentation agent其提供適當的ClassFileTransformer
,你將不得不使用反射來調用添加的方法。然而,這不是你想要做的,但它是可行的,並且有一個明確定義的界面。如果你想修改現有的方法,你可能會對AspectJ感興趣。
儘管可能,但它沒有用。
你將如何訪問這些新的領域和方法?
如果你想要的是添加的「屬性」的可能性,你不能直接使用這些方法和字段(如「普通」字段和方法),因爲他們不會被編譯。
和「方法」中,可以使用Map<String, Object>
作爲「動態屬性」,使用Map<String, SuitableInterface>
作爲「動態方法」,然後按名稱查找它們。
如果您需要Java的擴展語言,可以添加嵌入式動態語言(如Javascript或Groovy);其中大部分可以訪問任意的java對象和方法。
你可以用AOP做一些非常時髦的事情,雖然在運行時真正修改類是一個相當多毛的技術,需要大量的類加載魔法和魔術。
更容易的是使用AOP技術來生成目標類的子類,並向其中引入新方法,而不是稱爲「混入」或「引入」的AOP。請參閱here以瞭解Spring AOP如何實現它,但與您實際嘗試實現的內容相比,這可能相當蹩腳。
Downvoter - 請解釋。 – 2014-12-02 23:43:38