2012-12-14 71 views
0

我一直在學習Play!框架模塊,並期待擴展它,添加一些功能。我發現了一個從Enhancer(play.classloading.enhancers.Enhancer)擴展而來的類,並且找不到爲什麼Play!採用這種模式。玩!框架增強流程

爲什麼要加載類並使其社區代碼擴展如下所示?我已經閱讀了他們非常簡單的解釋哦,爲什麼他們這樣做,我覺得被當作祖母嘿嘿:http://www.playframework.org/documentation/1.2.5/main#Classenhancement

但它並沒有幫助,因爲我想。爲什麼我無法編寫我的用戶將使用預期功能擴展的類?在他們將不得不重新加載授予一些動態或特殊功能的類的情況下,好的,但我的插件代碼本質上是靜態的。

有誰知道他們爲什麼這樣做,如果我需要這樣做嗎? (在等待答案時要測試它!)

回答

1

字節碼增強是一種工具遊戲!用於擴展Java語言,並將一些「魔術」邏輯注入到應用程序的代碼中。一個例子是控制器的渲染方法增強它使您可以編寫以下代碼:

public static void myAction() { 
    String foo = "..."; 
    int bar = "..."; 
    render(foo, bar); 
} 

,而不是

public static void myAction() { 
    String foo = "..."; 
    int bar = "..."; 
    renderArgs.put("foo", foo); 
    renderArgs.put("bar", bar); 
    render(); 
} 

發生了什麼事是LocalVariableEnhancer將加強myAction方法和產生的變量名的地圖變量。在render方法中,它會檢查該映射並將變量自動放入renderArgs中。

還有其他一些例子,如get/set方法生成和JPA模型的靜態工廠方法等。play-morphia等模塊也大量使用字節碼增強器。我們的目標是提供一種終極應用程序開發人員的體驗,您無法在純Java語言框架中實現,例如繼承,接口等。

+0

我已經得到了,但它應該被每個插件使用,或者它已被用於某些案件? –

+1

不可以。不是所有的插件都需要重寫'PlayPlugin.enhance'方法,因此並不是所有的插件都需要'Enhancer'的子類。 –