Sin*_*ker 6 java templates class
我需要一个库或方法来从模板文本文件生成一个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.
}
}
Run Code Online (Sandbox Code Playgroud)
我想在模板中添加库导入,函数导入和参数或行添加,并将模板添加到项目中.//营运
导入操作后,代码将如下:
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.
}
}
Run Code Online (Sandbox Code Playgroud)
我搜索了一些库以进行此操作FreeMarker和ApacheVelocity被推荐用于一些类似的问题.但我并不完全理解如何使用FreeMarker进行此操作.我认为它很可能用作标记库(如JSTL)我不想在代码中使用模板关键字(如$(temp))只是函数"doImport","addFunction","addParameterToFunction"等等.是吗可以使用这个库,或者任何人都可以发送一些有关此操作的示例?
实际上,您想要以任意方式修改任意一段代码。
要以一般方式执行此操作,您非常需要能够解析文本,以便可以将结构放置在适当的结构化位置。通常使用的模板只是文本;没有可以挂帽子的结构。
最可靠的方法是使用源到源程序转换系统。这样的工具允许您明确声明:“如果您看到这个,则将其替换为那个”。为了实现你的目的,你会说,“如果你在类 X 中看到一组类声明,那么添加这个类”,通常表述为
a rewritesto b if condition c
Run Code Online (Sandbox Code Playgroud)
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";
Run Code Online (Sandbox Code Playgroud)
(->对应于“rewritesto”)这仅识别方法签名(通过搜索 AST,而不是原始文本)。引号是包含目标语言片段的元引号,需要区分目标语言文本和规则语言文本。r、m、p 是元变量,必须与给定规则签名的特定结构相匹配;\r \m \p 是目标文本中的元转义符,表示这些结构必须存在。左侧“ \r \m ( \p ) ” 匹配签名并将 r、m、p 绑定到支持它的 AST 结构;右侧指定替换,其中替换 r、m、p 的绑定值以获得替换。条件“if”的作用是坚持只修改所需的方法;如果您有大量代码并且只想使用其中的特定方法,则可能需要更复杂的条件。