有没有办法以编程方式从模板生成java类?

时间:2011-07-25 12:42:02

标签: java class templates

我需要一个库或方法来从模板文本文件生成一个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.
    }

}

我希望在模板中添加库导入,函数导入和参数或行添加,并将模板添加到项目中。 // OPERATIONS

导入操作后

代码如下:

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”等等。是吗可以使用这个库,或者任何人都可以发送一些有关此操作的示例吗?

2 个答案:

答案 0 :(得分:1)

这会有帮助吗? - JET templates

答案 1 :(得分:1)

实际上,您希望以任意方式修改任意代码段。

要以一般方式执行此操作,您几乎需要能够解析文本,以便您可以将结构放置在适当的结构化位置。通常使用的模板只是文本;没有结构挂你的帽子。

最可靠的方法是使用源到源program transformation系统。这样的工具允许您明确说明,“如果你看到这个,那就用它替换它”。 为了实现你的目的,你会说,“如果你在X类中看到一组类声明,那么添加这个类”,通常表示为

  a rewritesto b if condition c

DMS Software Reengineering Toolkit是一个程序转换工具,可以读取源代码, 构建编译器数据结构(AST,符号表,流程图),允许您将源到源重写应用于表示为这些结构的代码,使用源模式匹配/替换,然后从结果中重新生成有效源。 / p>

DMS有许多语言的解析器/漂亮打印机,包括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”是坚持只有所需的方法被修改;如果您有大量代码并希望只使用其中的特定方法,则可能需要更复杂的条件。