【问题标题】:Generated Java source with reflection使用反射生成的 Java 源代码
【发布时间】:2012-05-04 19:59:49
【问题描述】:

在我的 Java 应用程序中,我有一个类 Foo

class Foo {
  String field1;
  String field2;
}

我想要一些生成的代码,这些代码在此类中的字段上使用反射 (虚构的模板语言)

#for each Field $f in Foo.class.getDeclaredFields()
  #writeFile $f.java
    public @interface $f {
    }

最终目标是让 Field1.java 和 Field2.java 在每个内部只包含一个简单的@interface 定义。

是否有可用的模板语言可以将这一代作为 Maven 构建过程的一部分进行?

我能找到的最接近的是JET,但这个项目似乎更倾向于生成在运行时可用的 Java 源代码,而不是在编译时可用。理论上,我可能可以使用 AntRun 以及几个 Javac 和 Java 任务来完成这项工作,但它会很麻烦。

我需要它的实际用例是为 Google Guice 生成 BindingAnnotations(将在 GWT 源代码中使用,因此它们在编译时必须以 .java 文件的形式存在)。

【问题讨论】:

    标签: java templates reflection eclipse-jet


    【解决方案1】:

    我在这里建议两个选项:

    1. Apache Velocity:它提供的模板语言看起来与您所描述的相近。调查一下here。您可能会对他们的引擎感兴趣。

    2. GWTP 似乎做的事情与您想做的事情相似。看起来他们正在使用注释处理器来执行代码生成。这是processor example,他们的项目主页是here

    【讨论】:

    • 我稍微研究了 Velocity,但在从 Maven 构建运行时,我无法弄清楚如何从模板(字段名称)中从我的类中获取反射信息。 GWTP 看起来是一个非常有趣的项目,我将不得不更多地检查它。看起来有可能,尽管具有挑战性,让生成器从 Maven 构建中运行 (groups.google.com/group/gwt-platform/browse_thread/thread/…)
    • 我担心我可能会遇到生成的 Field1.java 文件将被其他源静态链接以进行编译(即 guice 模块中的绑定)的问题,因此源的生成必须发生在之前正常编译。你知道 GWTP 是否可以做到这一点?
    • @user460976 我不认为他们可以。我相信注释处理发生在编译之前,因此它可以工作,但只要你没有编译代码,生成的代码也不存在。第一次使用时,需要对代码进行注解,然后编译生成文件。
    【解决方案2】:

    看看Acceleo它是基于XSL模板生成源代码的。 我将它与EMF 一起使用,从用户设计的数据模型中生成源代码。

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 2010-11-13
      • 2011-02-07
      • 2023-03-20
      • 2011-02-25
      • 1970-01-01
      • 2012-12-03
      • 2013-02-02
      • 2010-12-26
      相关资源
      最近更新 更多