我一直在学习Play!框架模块并期待扩展它,添加一些功能。我发现了一个扩展自Enhancer(play.classloading.enhancers.Enhancer)的类,无法弄清楚Play的原因!采用这种模式。
为什么要加载类并使其社区代码扩展如此?我已经阅读了他们非常简单的解释哦,为什么他们这样做,我觉得自己被视为祖母呵呵:http://www.playframework.org/documentation/1.2.5/main#Classenhancement
但它并没有像我想的那样有帮助。为什么我不能只编写我的用户将使用预期功能扩展的类?如果他们必须在给定动态或特殊功能的情况下重新加载类,那么确定,但我的插件代码本质上是静态的。
有谁知道他们为什么这样做,以及我是否需要这样做? (在等待答案的同时进行测试!)
答案 0 :(得分: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语言框架中提供,例如继承,接口等。