欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

FreeMarker应用一例——生成Java代码(转)

程序员文章站 2022-03-12 20:08:39
...
对FreeMarker而言,无非是“Template + data-model = output”。

这里,假设我们所要生成的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();
    }

}