從一個Java基本接口開始,我希望其他人能夠直接或間接地擴展此接口,並向其添加Bean屬性和行爲,作爲插件系統。什麼是在運行時生成Java接口高效實現的最簡單方法?
然後,在運行時,在用戶計算機上,我會找到所有這些接口並生成一個實現它們的大類。 bean屬性所需的字段將自動生成,而接口中定義的行爲將實現爲輔助類的靜態方法(由插件開發人員創建),它將適當的接口作爲第一個參數,從而實現接口方法將委託給一個靜態方法,傳遞「this」作爲第一個參數。
這與Scala如何實現它的特性很相似。
我看到3種方式這樣做的:
- 使用Java的動態代理,這是基於反射。
- 將源代碼生成爲字符串,並在運行時對其進行編譯。
- 使用一些字節碼操作庫在運行時生成類。
選項1是最簡單但效率最低的,因此我想要一個更好的解決方案。選項2會給我一個有效的實施,但是相當醜陋。
雖然我看到幾個可以做選項3的庫,但他們似乎都要求我首先學習Java的彙編語言,我認爲這是一項非常耗時的活動,最終沒有什麼好處..
因爲我不想學習任何彙編器,JVM或其他,是選項2我最好的選擇,還是有庫可以生成動態代理沒有我使用JVM彙編器?
我在這裏發現這個例子http://today.java.net/pub/a/today/2008/04/24/add-logging-at-class-load-time-with-instrumentation.html,那是比BCEL更容易理解。 –
來自Javaassist主頁:「Javassist提供源代碼級抽象;程序員可以修改一個類文件,而不需要詳細瞭解Java字節碼,甚至不必編寫插入的字節碼序列」 –