对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();
- }
- }