Java运行时类生成框架

3
我希望将Java 8的一个功能引入到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接口的实现。类似于Java 8中的Foo::getProperty1

public class Foo1Extractor implements Extractor<Foo> {
  public Object getProperty(Foo anObject) {
    return anObject.getProperty1();
  }
}

我应该使用JavaCompiler(目前我只需要实现少量接口并且可以使用模板类)还是你有更好的解决方案?

主要要求是生成字节码时间短,并且具有LGPL兼容性(可用于商业产品)。

如果可能,请为我的情况提供一个小例子。


2
只是一句话:虽然这里使用了反射,可能无法满足您的性能要求,但“动态代理类”可以很好地用于解决一般的任务。http://docs.oracle.com/javase/8/docs/technotes/guides/reflection/proxy.html - Marco13
1个回答

2
如果你的应用程序每秒执行数百万次操作,那么除非你使用生成的类替换反射,否则可能看不到明显的性能改进。此外,将动态代码生成添加到项目中的复杂度(无论是在运行时还是编译时)都相当高。因此,我建议只有在证明了反射是真正的瓶颈时再考虑使用它。
无论如何,在JDK 7中进行编译时代码生成,您可以使用注释处理API,这实际上是javac的插件API,您可以将其与某种模板引擎结合使用。请查看this项目,该项目利用注释处理的功能来做一些不错的事情。

我的预测也告诉我,即使是我们客户的旧电脑,我也不应该遇到任何性能瓶颈。因此,我们将暂停这个项目。 - Sergiy Medvynskyy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接