2012-12-14 72 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'的子类。 –