2011-07-14 54 views
2

從一個Java基本接口開始,我希望其他人能夠直接或間接地擴展此接口,並向其添加Bean屬性和行爲,作爲插件系統。什麼是在運行時生成Java接口高效實現的最簡單方法?

然後,在運行時,在用戶計算機上,我會找到所有這些接口並生成一個實現它們的大類。 bean屬性所需的字段將自動生成,而接口中定義的行爲將實現爲輔助類的靜態方法(由插件開發人員創建),它將適當的接口作爲第一個參數,從而實現接口方法將委託給一個靜態方法,傳遞「this」作爲第一個參數。

這與Scala如何實現它的特性很相似。

我看到3種方式這樣做的:

  1. 使用Java的動態代理,這是基於反射。
  2. 將源代碼生成爲字符串,並在運行時對其進行編譯。
  3. 使用一些字節碼操作庫在運行時生成類。

選項1是最簡單但效率最低的,因此我想要一個更好的解決方案。選項2會給我一個有效的實施,但是相當醜陋。

雖然我看到幾個可以做選項3的庫,但他們似乎都要求我首先學習Java的彙編語言,我認爲這是一項非常耗時的活動,最終沒有什麼好處..

因爲我不想學習任何彙編器,JVM或其他,是選項2我最好的選擇,還是有庫可以生成動態代理沒有我使用JVM彙編器?

回答

2

看一看Javassist。藉助它,您可以使用直接的API對運行時類進行更改。你不需要知道Java的「黑魔法」就可以使用它。

+0

我在這裏發現這個例子http://today.java.net/pub/a/today/2008/04/24/add-logging-at-class-load-time-with-instrumentation.html,那是比BCEL更容易理解。 –

+0

來自Javaassist主頁:「Javassist提供源代碼級抽象;程序員可以修改一個類文件,而不需要詳細瞭解Java字節碼,甚至不必編寫插入的字節碼序列」 –

1

使用BCEL時,您不必知道java彙編程序。 Lok在this proxy

+0

在這個例子中,您仍然需要添加諸如「il.append(new ALOAD(0))」,這是JVM彙編程序。我發現Javaassist示例更容易遵循。 –

相關問題