Template + Data Model = 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; }
}
(root)
|
+- class = "F32B"
|
+- properties
|
+- currency : { name="currency", type="String" }
+- amount : { name="amount", type="Double" }
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>
}
關鍵指令:
<#list properties as prop> 遍歷集合
${prop.name?cap_first} 首字母大寫(getAmount/setAmount)
public class GenObjects {
public static void main(String[] args) throws IOException, TemplateException {
// 1. 配置
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File("D:/.../templates"));
cfg.setObjectWrapper(new DefaultObjectWrapper());
// 2. 取得模板
Template temp = cfg.getTemplate("SwiftFieldClass.ftl");
// 3. 建構資料模型
Map root = new HashMap();
root.put("class", "F32B");
Collection properties = new HashSet();
root.put("properties", properties);
Map currency = new HashMap(); currency.put("name","currency"); currency.put("type","String"); properties.add(currency);
Map amount = new HashMap(); amount.put("name","amount"); amount.put("type","Double"); properties.add(amount);
// 4. 合併輸出
Writer out = new OutputStreamWriter(System.out);
temp.process(root, out);
out.flush();
}
}
FreeMarker 以「模板+資料」極簡模型,賦予代碼生成極大靈活性與可維護性。