一直從事web開(kāi)發(fā)工作,最近發(fā)現(xiàn)一直在寫(xiě)幾乎重復(fù)的代碼,于是就想著給項(xiàng)目中添加一個(gè)代碼生成器的功能。大體思路如下:(數(shù)據(jù)+模板)

思路圖
這里我使用的模塊引擎為:beetl(國(guó)人開(kāi)發(fā)的,官網(wǎng)有詳盡的文檔)。
下面我以生成bean java類(lèi)為例的實(shí)現(xiàn):
- bean類(lèi)文件的模板如下:
package #{bean.beanPackage};
/**
* @author #{bean.beanAuthor} #{bean.beanCreateTime}
*
*/
public class #{bean.beanClassName} extends AbsBean{
<#
for(param in bean.properties){
#>
private #{param.type} #{param.name};//#{param.remark}
<#}#>
<#
for(param in bean.properties){
var firstChar = strutil.subStringTo(param.name,0,1);
var firstChar_upper = strutil.toUpperCase(firstChar);
var paramName = strutil.replace (param.name,firstChar,firstChar_upper);
#>
public String get#{paramName}() {
return #{param.name};
}
public void set#{paramName}(String #{param.name}) {
this.#{param.name} = #{param.name};
}
<#}#>
}
java 代碼如下:
public class MyGenerator {
public static void main(String[] args) throws IOException {
String root = System.getProperty("user.dir")+File.separator+"template";//模板路徑
FileResourceLoader resourceLoader = new FileResourceLoader(root,"utf-8");
Configuration cfg = Configuration.defaultConfiguration();
GroupTemplate gt = new GroupTemplate(resourceLoader, cfg);
MyGenerator t = new MyGenerator();
t.getCodeForBean(gt, "/bean.template");//
}
/**
*
* @param gt
* @param FilePath 模板路徑
*/
private void getCodeForBean(GroupTemplate gt,String FilePath){
Template t = gt.getTemplate(FilePath);
BeanOfBean bean = new BeanOfBean();
bean.setBeanAuthor("Tom");
bean.setBeanClassName("TestBean");
bean.setBeanCreateTime(new Date().toString());
bean.setBeanPackage("com.space.test.bean");
List<ColumnBean> list = new ArrayList<ColumnBean>();
ColumnBean b = new ColumnBean();
b.setName("id");//字段名
b.setRemark("id");//字段備注
b.setType("String");//字段類(lèi)型
ColumnBean b2 = new ColumnBean();
b2.setName("name");//字段名
b2.setRemark("名稱");//字段備注
b2.setType("String");//字段類(lèi)型
list.add(b);
list.add(b2);
bean.setProperties(list);
t.binding("bean",bean);
String str = t.render();
System.out.println(str);//打印出生成的代碼
}
}
運(yùn)行后控制臺(tái)輸出的代碼如下:
package com.space.test.bean;
/**
* @author Tom Mon Sep 26 16:36:59 CST 2016
*
*/
public class TestBean extends AbsBean{
private String id;//id
private String name;//名稱
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
總結(jié):一個(gè)代碼生成器其實(shí)就是:數(shù)據(jù)被填充到模板中,而填充使用模板引擎(或者自己用代碼實(shí)現(xiàn)) ,這些模板引擎各自有自己的語(yǔ)法,當(dāng)然他們的效率以及優(yōu)勢(shì)各有不同。