在java web項(xiàng)目中編寫(xiě)自己的代碼生成器

一直從事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ì)各有不同。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,696評(píng)論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,011評(píng)論 0 11
  • 多態(tài) 任何域的訪問(wèn)操作都將有編譯器解析,如果某個(gè)方法是靜態(tài)的,它的行為就不具有多態(tài)性 java默認(rèn)對(duì)象的銷(xiāo)毀順序與...
    yueyue_projects閱讀 1,091評(píng)論 0 1
  • 四月第一篇日記,簡(jiǎn)單打卡。 暴風(fēng)雨之前的平靜,我總是很平靜。
    發(fā)呆的李相赫閱讀 129評(píng)論 0 0

友情鏈接更多精彩內(nèi)容