FreeMarker应用一例——生成Java代码(转)
程序员文章站
2022-03-12 20:11:45
...
对FreeMarker而言,无非是“Template + data-model = output”。
这里,假设我们所要生成的Java代码,即“output”如下:
其中,类名、属性都属于“data-model”,其可用树形结构表现如下:
(root)
|
+- class = “F32B”
|
|- properties
| |
| +- currency
| | |
| | +- name = “currency”
| | |
| | +- type = “String”
| |
| +- amount
| | |
| | +- name = “amount”
| | |
| | +- type = “Double”
那么,则可使用如下“Template”:
最后,将FreeMarker文档中的例子改动一下,测试生成“output”的Java程序如下:
这里,假设我们所要生成的Java代码,即“output”如下:
package com.cs.qdog.swift.objects; public class F32B { private Double amount; private String currency; public Double getAmount() { return amount; } public void setAmount(Double amount) { this.amount = amount; } public String getCurrency() { return currency; } public void setCurrency(String currency) { this.currency = currency; } }
其中,类名、属性都属于“data-model”,其可用树形结构表现如下:
(root)
|
+- class = “F32B”
|
|- properties
| |
| +- currency
| | |
| | +- name = “currency”
| | |
| | +- type = “String”
| |
| +- amount
| | |
| | +- name = “amount”
| | |
| | +- type = “Double”
那么,则可使用如下“Template”:
package com.cs.qdog.swift.objects; public class ${class} { <#list properties as prop> private ${prop.type} ${prop.name}; </#list> <#list properties as prop> public ${prop.type} get${prop.name?cap_first}(){ return ${prop.name}; } public void set${prop.name?cap_first}(${prop.type} ${prop.name}){ this.${prop.name} = ${prop.name}; } </#list> }
最后,将FreeMarker文档中的例子改动一下,测试生成“output”的Java程序如下:
package com.cs.qdog.swift.objects; import java.io.File; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.DefaultObjectWrapper; import freemarker.template.Template; import freemarker.template.TemplateException; public class GenObjects { public static void main(String[] args) throws IOException, TemplateException { /* ------------------------------------------------------------------- */ /* You usually do it only once in the whole application life-cycle: */ /* Create and adjust the configuration */ Configuration cfg = new Configuration(); cfg.setDirectoryForTemplateLoading(new File( "D:/Temp/EclipseWorkSpace/GenSwiftFields/templates")); cfg.setObjectWrapper(new DefaultObjectWrapper()); /* ------------------------------------------------------------------- */ /* You usually do these for many times in the application life-cycle: */ /* Get or create a template */ Template temp = cfg.getTemplate("SwiftFieldClass.ftl"); /* Create a data-model */ Map<String, Object> root = new HashMap<String, Object>(); root.put("class", "F32B"); Collection<Map<String, String>> properties = new HashSet<Map<String, String>>(); root.put("properties", properties); /* subfield 1: currency */ Map<String, String> currency = new HashMap<String, String>(); currency.put("name", "currency"); currency.put("type", "String"); properties.add(currency); /* subfield 2: amount */ Map<String, String> amount = new HashMap<String, String>(); amount.put("name", "amount"); amount.put("type", "Double"); properties.add(amount); /* Merge data-model with template */ Writer out = new OutputStreamWriter(System.out); temp.process(root, out); out.flush(); } }