我想拥有Java 8 for Java 7的一个特性:为方法自动生成接口实现(以避免因反射调用而导致的性能不足)。我知道Java 8在编译时提供了生成,但我认为Java 7不可能(没有维护元数据文件)。所以我同意在运行时生成实现。
示例:
我有以下界面:
public interface Extractor<E> {
public Object getProperty(E aSourceObject);
}
和bean类(或接口)
public class Foo {
public int getProperty1();
public String getProperty2();
public boolean getProperty3();
}
我需要为Foo的每个属性提供Extractor接口的实现。类似于{8}的Foo::getProperty1
。
public class Foo1Extractor implements Extractor<Foo> {
public Object getProperty(Foo anObject) {
return anObject.getProperty1();
}
}
我应该使用JavaCompiler
(目前我实现的界面很少,可以使用模板类)还是你有更好的解决方案?
主要要求是短字节码生成时间和LGPL兼容性(可用于商业产品)。
如果可能,请为我的案例提供一些示例。
答案 0 :(得分:2)
如果使用生成的类替换反射,则可能看不到可见的性能改进,除非您的应用程序每秒执行数百万次操作。将动态代码生成添加到项目(在运行时和编译时)的复杂性也非常高。因此,我建议只有在反射被证明是真正的瓶颈时才能实现它。
无论如何,对于JDK 7中编译时的代码生成,您可以使用the annotation processing API,它基本上是javac的插件API,您可以将它与某种模板引擎结合使用。看看this项目,该项目利用注释处理的强大功能来做很好的事情。