2012-04-24 59 views
2

在我的Java应用程序生成的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文件的形式存在)。

回答

0

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

0

我会建议在这里两个选项:

  1. 阿帕奇速度:它提供了一个寻找靠近你的描述模板语言。看看它here。你可能会对他们的引擎感兴趣。

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

+0

我对Velocity进行了一些研究,但是我无法弄清楚从Maven构建中运行时如何从模板(字段名称)中从我的类获取反射信息。 GWTP看起来像一个非常有趣的项目,我将不得不更多地检查它。它看起来像是可能的,但具有挑战性,让发电机运行Maven构建(http://groups.google.com/group/gwt-platform/browse_thread/thread/cad03cb1a7b98c9e/d060ebd4c26b4534) – idle 2012-04-24 14:52:59

+0

我担心我可能会遇到生成的Field1.java文件将被其他源静态链接以编译的问题(即,在guice模块中进行绑定),因此源的生成必须在正常编译之前进行。你知道GWTP是否可以做到这一点? – idle 2012-04-24 14:54:13

+0

@ user460976我不认为他们可以。我相信注释处理是在编译之前发生的,因此它可以工作,但只要你没有编译代码,生成的代码也不存在。第一次你想使用它,你需要注释代码然后编译它,以便生成生成的文件。 – 2012-04-24 14:57:50