簡體   English   中英

有沒有辦法以編程方式從模板生成java類?

[英]Is there any way to programmatically generate java class from a template?

我需要一個庫或方法來從模板文本文件生成一個java類(只是生成類的源代碼作為文本格式,不需要運行或使用它)。

作為一個例子,我有一個類模板

package packagename.name.abc;

import lib.sub.sub;

import lib.sub.sub2;

public class templateClass {

    public String getTemplateText() {
    //some operations here.
    }

    PlaceController getPlaceController() {
    //some operations here.
    }

}

我想在模板中添加庫導入,函數導入和參數或行添加,並將模板添加到項目中。 //營運

導入操作后,代碼將如下:

package packagename.name.abc;

import lib.sub.sub; 
import lib.sub.sub2;
import NEWLIB.NEWSUB.NEWSUB;                 // NEW LIBRARY

public class templateClass {

    public String getTemplateText(String PARAMETER ) { // NEW PARAMETER
    //some operations here.
    String NEW_LINE = "";                // NEW LINE
    }

    PlaceController getPlaceController() {
    //some operations here.
    }

    public String getNEWText() {             //NEW FUNCTION
    //some operations here.
    }

}

我搜索了一些庫以進行此操作FreeMarker和ApacheVelocity被推薦用於一些類似的問題。 但我並不完全理解如何使用FreeMarker進行此操作。 我認為它很可能用作標記庫(如JSTL)我不想在代碼中使用模板關鍵字(如$(temp))只是函數“doImport”,“addFunction”,“addParameterToFunction”等等。是嗎可以使用這個庫,或者任何人都可以發送一些有關此操作的示例?

這會有幫助嗎? - JET模板

實際上,您希望以任意方式修改任意代碼段。

要以一般方式執行此操作,您幾乎需要能夠解析文本,以便您可以將結構放置在適當的結構化位置。 通常使用的模板只是文本; 沒有結構掛你的帽子。

最可靠的方法是使用源到源程序轉換系統。 這樣的工具允許您明確說明,“如果你看到這個,那就用它替換它”。 為了實現你的目的,你會說,“如果你在類X中看到一組類聲明,那么添加這個類”,通常表示為

  a rewritesto b if condition c

DMS軟件重新設計工具包是一個程序轉換工具,它將讀取源代碼,構建編譯器數據結構(AST,符號表,流程圖),允許您將源到源重寫應用於表示為這些結構的代碼,使用源代碼匹配/替換的模式,然后從結果中重新生成有效的源。

DMS有許多語言的解析器/ prettyprinters,包括Java(1.4 / 1.5 / 1.6),C,C ++,C#,COBOL,PHP,JavaScript,......

對於add-a-parameter任務,使用DMS可以編寫以下轉換規則:

add_string_parameter(r:result_type,m:IDENTIFIER,p:parameter_list):
    method_signature->method_signature
=  " \r \m ( \p ) " -> " \r \m ( \p , String PARAMETER ) " if m="getTemplateText";

- >對應於“rewritesto”)這個只能識別方法簽名(通過搜索AST,而不是原始文本)。 引號是包含目標語言片段的元引號 ,需要區分目標語言文本和規則語言文本。 r,m,p是在給定規則的簽名時必須與特定結構匹配的元變量; \\ r \\ m \\ p是目標文本中的元轉義,表示必須存在這些結構。 左側“\\ r \\ m(\\ p)”匹配簽名並將r,m,p綁定到AST結構支持它; 右側指定替換,其中r,m,p的邊界值被替代以獲得替換。 條件“if”是堅持只有所需的方法被修改; 如果您有大量代碼並想要只使用其中的特定方法,則可能需要更復雜的條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM