有没有办法通过编程从模板生成Java类?

7

我需要一个库或方法来生成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”等。这些库是否支持此功能,或者是否有人可以提供一些关于这些操作的示例?

2个回答

1

是的,但有一个前提条件,它需要一个具有JET性质的项目来执行流程。但我正在开发一个Eclipse插件项目,给我的插件添加JET性质对我来说不好。我只需要在我的插件项目中对一个字符串或包含Java源代码的文本文件执行相同的操作。 - Sinan Goker

1

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

为了以一般方式完成此操作,您几乎需要能够解析文本,以便将结构放置在适当的结构化位置。正常使用的模板只是文本;没有结构可以依靠。

最可靠的方法是使用源到源程序转换系统。这样的工具允许您明确地声明:“如果您看到这个,则用那个替换它”。 为了实现您的目的,您会说类似于“如果您在X类中看到一组类声明,则添加此类”的内容,通常陈述为

  a rewritesto b if condition c

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

DMS拥有许多语言的解析器/美化程序,包括Java(1.4/1.5/1.6)、C、C++、C#、COBOL、PHP、JavaScript等。

对于您的添加参数任务,使用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";

(-> 对应“重写为”)。这只识别方法签名(通过搜索AST而不是原始文本)。引号是包含目标语言片段的元引用,并且需要区分目标语言文本和规则语言文本。r、m、p是必须与规则签名中给定的特定结构相匹配的元变量;\r \m \p是目标文本中的元转义符,表示这些结构必须存在。左边的“\r \m ( \p )”匹配签名并将r、m、p绑定到支持它的AST结构;右边指定一个替换,其中r、m、p的绑定值被替换以获得替换。条件“if”用于坚持仅修改所需的方法;如果您有一堆代码,并希望仅命中其中的特定方法,则可能需要更复杂的条件。


感谢提供宝贵的信息。我正好要尝试这个过程。看起来对我来说很困难,但我明天会在工作中尝试。 - Sinan Goker
源代码转换是解决我的问题的正确方案。我尝试了向函数添加参数、添加导入行和一些简单的代码块。但由于我完成项目的时间有限,我无法实现完全灵活的模板机制。我使用了一些不太灵活的模板结构,使用字符串操作。再次感谢。 - Sinan Goker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接