2012-04-24 89 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