在java web项目中编写自己的代码生成器

一直从事web开发工作,最近发现一直在写几乎重复的代码,于是就想着给项目中添加一个代码生成器的功能。大体思路如下:(数据+模板)


思路图

这里我使用的模块引擎为:beetl(国人开发的,官网有详尽的文档)。
下面我以生成bean java类为例的实现:

  • bean类文件的模板如下:
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");//字段类型
        ColumnBean b2 = new ColumnBean();
        b2.setName("name");//字段名
        b2.setRemark("名称");//字段备注
        b2.setType("String");//字段类型
        list.add(b);
        list.add(b2);
        bean.setProperties(list);
        
        t.binding("bean",bean);
        String str = t.render();
        System.out.println(str);//打印出生成的代码
    }   
}

运行后控制台输出的代码如下:

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;
    }
    
}

总结:一个代码生成器其实就是:数据被填充到模板中,而填充使用模板引擎(或者自己用代码实现) ,这些模板引擎各自有自己的语法,当然他们的效率以及优势各有不同。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,224评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,677评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 9,305评论 0 11
  • 多态 任何域的访问操作都将有编译器解析,如果某个方法是静态的,它的行为就不具有多态性 java默认对象的销毁顺序与...
    yueyue_projects阅读 4,599评论 0 1
  • 四月第一篇日记,简单打卡。 暴风雨之前的平静,我总是很平静。
    发呆的李相赫阅读 1,099评论 0 0

友情链接更多精彩内容