【问题标题】:Is there any way to programmatically generate java class from a template?有没有办法以编程方式从模板生成 java 类?
【发布时间】:2011-10-12 13:50:00
【问题描述】:

我需要一个库或方法来从模板文本文件生成 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”等。是吗可以使用这个库或者任何人都可以发送一些关于这个操作的例子吗?

【问题讨论】:

    标签: java class templates


    【解决方案1】:

    这会有帮助吗? - JET templates

    【讨论】:

    • 是的,但有一点,它需要一个具有 JET 性质的项目来做流程。但是我正在开发一个 Eclipse Plug-in 项目并将 JET 特性赋予我的插件对我不利。我只需要对我的插件项目中包含 java 源代码的字符串或文本文件进行相同的操作。
    【解决方案2】:

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

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

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

      a rewritesto b if condition c
    

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

    DMS 具有适用于多种语言的解析器/prettyprinters,包括 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";
    

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

    【讨论】:

    • 感谢您提供宝贵的信息。我正是尝试做这个过程。对我来说看起来很难,但我明天要在工作中尝试。
    • 源到源程序转换是我的问题的正确解决方案。我尝试向函数添加参数,添加导入行和一些简单的代码块。但是,由于我完成项目的时间有限。我无法努力实现完全灵活的模板机制。我使用字符串操作使用了一些不灵活的模板结构。再次感谢。
    猜你喜欢
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2014-11-09
    • 2010-09-18
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多