使用molicode处理Java源代码

原创
2019/04/14 10:53
阅读数 3.3K

使用molicode处理Java源代码

背景描述

在日常工作中,我们常常需要直接分析Java源码,用来生成文档,或者转换为其它数据模型来使用。

场景1 获取Java源码中的属性列表

数据源:

package com.shareyi.user.center.domain.config;

import com.shareyi.user.center.domain.BasicDomain;

import java.io.Serializable;
/**
 * 配置信息 Domain 类
 *
 * @author MoliCode
 * @date 2019-04-14
 */
public class AcConfig extends BasicDomain implements Serializable {

  private static final long serialVersionUID = 5405437785373882510L;

  /** 类型 */
  private Integer type;
  /** 项目key */
  private String projectKey;
  /** 范围 */
  private Integer scope;
  /** 配置key */
  private String configKey;
  /** 配置值 */
  private String configValue;
  /** 扩展1 */
  private String ext1;
  /** 扩展2 */
  private String ext2;
  /** 扩展3 */
  private String ext3;
  /** 创建人 */
  private String creator;

  public void setType(Integer type) {
    this.type = type;
  }

  public Integer getType() {
    return this.type;
  }

  public void setProjectKey(String projectKey) {
    this.projectKey = projectKey;
  }

  public String getProjectKey() {
    return this.projectKey;
  }

  public void setScope(Integer scope) {
    this.scope = scope;
  }

  public Integer getScope() {
    return this.scope;
  }

  public void setConfigKey(String configKey) {
    this.configKey = configKey;
  }

  public String getConfigKey() {
    return this.configKey;
  }

  public void setConfigValue(String configValue) {
    this.configValue = configValue;
  }

  public String getConfigValue() {
    return this.configValue;
  }

  public void setExt1(String ext1) {
    this.ext1 = ext1;
  }

  public String getExt1() {
    return this.ext1;
  }

  public void setExt2(String ext2) {
    this.ext2 = ext2;
  }

  public String getExt2() {
    return this.ext2;
  }

  public void setExt3(String ext3) {
    this.ext3 = ext3;
  }

  public String getExt3() {
    return this.ext3;
  }

  public void setCreator(String creator) {
    this.creator = creator;
  }

  public String getCreator() {
    return this.creator;
  }
}

模板:

<%
    //获取Java源码属性列表,并进行属性复制
    data.fieldList.each { it ->
        def upperFistName = tableNameUtil.upperFirst(it.dataName)
        println """     dest.set${upperFistName}(src.get${upperFistName}());"""
    }
%>

输出内容:

2019-04-14 10:47:49,073 [http-nio-8098-exec-7] INFO   (frontConsole:-1) - 
 [Java源码复制属性]模板执行成功,输出到前台,应输出路径:/study02_output/copyBean.txt
==============模板输出开始 =================
     dest.setType(src.getType());
     dest.setProjectKey(src.getProjectKey());
     dest.setScope(src.getScope());
     dest.setConfigKey(src.getConfigKey());
     dest.setConfigValue(src.getConfigValue());
     dest.setExt1(src.getExt1());
     dest.setExt2(src.getExt2());
     dest.setExt3(src.getExt3());
     dest.setCreator(src.getCreator());

==============模板输出结束 =================

操作步骤:

copyBean

场景2 获取Java源码中的方法列表

数据源:

package com.shareyi.user.center.service;

import com.shareyi.user.center.common.web.CommonResult;
import com.shareyi.user.center.common.web.PageQuery;
import com.shareyi.user.center.domain.BasicDomain;

import java.util.List;

/**
 * 基础的服务类 service
 *
 * @author david
 * @date 2018/8/21
 */
public interface BaseService<T extends BasicDomain> {

    /**
     * 添加操作
     *
     * @param t
     * @return
     */
    CommonResult<T> add(T t);

    /**
     * 修改操作
     *
     * @param t
     * @return
     */
    CommonResult<T> update(T t);

    /**
     * 根据主键删除
     */
    CommonResult<String> deleteByPk(Long primaryKey);

    /**
     * 通过主键ID查询数据
     *
     * @param primaryKey
     * @return
     */
    CommonResult<T> getByPk(Long primaryKey);

    /**
     * 分页查询数据
     *
     * @param pageQuery
     * @return
     */
    CommonResult<List<T>> queryByPage(PageQuery pageQuery);
}

模板: study02/javaSourceMethodList.gsp

<%
    /
     * 
     * 闭包,获取方法的注释信息
     */
    def getMethodComment = { javaDocComment ->
        def comment = "";
        if (javaDocComment.isPresent()) {
            comment = javaDocComment.get().getContent()
        }

        def commentLines = comment.split("\n");
        for (def commentLine in commentLines) {
            def cLine = commentLine.trim().replaceAll("\\*", "");
            if (cLine.length() > 1) {
                return cLine;
            }
        }
        return comment;
    }


    //遍历方法列表,并输出方法名称+注释
    data.methodDeclarationList.each { method ->
        def javaDocComment = method.getJavadocComment()
        def comment = getMethodComment(javaDocComment)
        println """${method.name}  (${comment})"""


    }
%>

输出内容:

2019-04-14 10:42:51,616 [http-nio-8098-exec-6] INFO   (frontConsole:-1) - 
 [Java源码获取方法列表]模板执行成功,输出到前台,应输出路径:/study02_output/methodList.txt
==============模板输出开始 =================
add  ( 添加操作)
update  ( 修改操作)
deleteByPk  ( 根据主键删除)
getByPk  ( 通过主键ID查询数据)
queryByPage  ( 分页查询数据)

==============模板输出结束 =================

操作步骤:

methodList

场景3 通过Java源码生成tableModel模型xml

数据源:

package com.shareyi.user.center.domain.config;

import com.shareyi.user.center.domain.BasicDomain;

import java.io.Serializable;
/**
 * 配置信息 Domain 类
 *
 * @author MoliCode
 * @date 2019-04-14
 */
public class AcConfig extends BasicDomain implements Serializable {

  private static final long serialVersionUID = 5405437785373882510L;

  /** 类型 */
  private Integer type;
  /** 项目key */
  private String projectKey;
  /** 范围 */
  private Integer scope;
  /** 配置key */
  private String configKey;
  /** 配置值 */
  private String configValue;
  /** 扩展1 */
  private String ext1;
  /** 扩展2 */
  private String ext2;
  /** 扩展3 */
  private String ext3;
  /** 创建人 */
  private String creator;

  public void setType(Integer type) {
    this.type = type;
  }

  public Integer getType() {
    return this.type;
  }

  public void setProjectKey(String projectKey) {
    this.projectKey = projectKey;
  }

  public String getProjectKey() {
    return this.projectKey;
  }

  public void setScope(Integer scope) {
    this.scope = scope;
  }

  public Integer getScope() {
    return this.scope;
  }

  public void setConfigKey(String configKey) {
    this.configKey = configKey;
  }

  public String getConfigKey() {
    return this.configKey;
  }

  public void setConfigValue(String configValue) {
    this.configValue = configValue;
  }

  public String getConfigValue() {
    return this.configValue;
  }

  public void setExt1(String ext1) {
    this.ext1 = ext1;
  }

  public String getExt1() {
    return this.ext1;
  }

  public void setExt2(String ext2) {
    this.ext2 = ext2;
  }

  public String getExt2() {
    return this.ext2;
  }

  public void setExt3(String ext3) {
    this.ext3 = ext3;
  }

  public String getExt3() {
    return this.ext3;
  }

  public void setCreator(String creator) {
    this.creator = creator;
  }

  public String getCreator() {
    return this.creator;
  }
}

模板:

<%
    /**
     * 本模板用于将Java源码(Java bean),反向转换为tableModel, 用于生成业务代码。
     * 需要特别注意的是,这个方式生成的tableModel可能会有属性遗漏,或者字段类型映射错误。
     * 需要您手动进行部分调整,特别说明一下。
     */
%><?xml version="1.0" encoding="UTF-8" ?>
<tableModel>
    <tableDefine id='${data.className}' cnname='${data.className}'
                 dbTableName='${tableNameUtil.convertToDbNames(data.className)}'>
        <%
            def columnNameList = []
            data.fieldList.each { it ->
                def columnName = tableNameUtil.convertToDbNames(it.dataName).toLowerCase();
                columnNameList.add(columnName)
        %>
        <column dataName='${it.dataName}' columnName='${columnName}' cnname='${it.comment}'
                columnType='${tableNameUtil.transToColumnType(it.fieldClass)}'
                canBeNull='false' readonly='false' isPK='false' jspTag='TEXT' comment='${it.dataName}'/><%
        }
        def columnNames = StringUtils.join(columnNameList, ",");
    %>

    </tableDefine>
    <orderColumns>
        <orderColumn orderType='desc'>id</orderColumn>
    </orderColumns>
    <bizFieldsMap>
        <bizFields key='createTime'>created</bizFields>
        <bizFields key='updateTime'>modified</bizFields>
        <bizFields
                key='queryList'>${columnNames}</bizFields>
        <bizFields
                key='addList'>${columnNames}</bizFields>
        <bizFields
                key='updateList'>${columnNames}</bizFields>
        <bizFields
                key='viewList'>${columnNames}</bizFields>
        <bizFields key='searchKey'>${columnNames}</bizFields>
        <bizFields
                key='allColumn'>${columnNames}</bizFields>
    </bizFieldsMap>

</tableModel>

输出内容:

<?xml version="1.0" encoding="UTF-8" ?>
<tableModel>
    <tableDefine id='AcConfig' cnname='AcConfig'
                 dbTableName='AC_CONFIG'>
        
        <column dataName='type' columnName='type' cnname='类型'
                columnType='TINYINT'
                canBeNull='false' readonly='false' isPK='false' jspTag='TEXT' comment='type'/>
        <column dataName='projectKey' columnName='project_key' cnname='项目key'
                columnType='VARCHAR'
                canBeNull='false' readonly='false' isPK='false' jspTag='TEXT' comment='projectKey'/>
        <column dataName='scope' columnName='scope' cnname='范围'
                columnType='TINYINT'
                canBeNull='false' readonly='false' isPK='false' jspTag='TEXT' comment='scope'/>
        <column dataName='configKey' columnName='config_key' cnname='配置key'
                columnType='VARCHAR'
                canBeNull='false' readonly='false' isPK='false' jspTag='TEXT' comment='configKey'/>
        <column dataName='configValue' columnName='config_value' cnname='配置值'
                columnType='VARCHAR'
                canBeNull='false' readonly='false' isPK='false' jspTag='TEXT' comment='configValue'/>
        <column dataName='ext1' columnName='ext1' cnname='扩展1'
                columnType='VARCHAR'
                canBeNull='false' readonly='false' isPK='false' jspTag='TEXT' comment='ext1'/>
        <column dataName='ext2' columnName='ext2' cnname='扩展2'
                columnType='VARCHAR'
                canBeNull='false' readonly='false' isPK='false' jspTag='TEXT' comment='ext2'/>
        <column dataName='ext3' columnName='ext3' cnname='扩展3'
                columnType='VARCHAR'
                canBeNull='false' readonly='false' isPK='false' jspTag='TEXT' comment='ext3'/>
        <column dataName='creator' columnName='creator' cnname='创建人'
                columnType='VARCHAR'
                canBeNull='false' readonly='false' isPK='false' jspTag='TEXT' comment='creator'/>

    </tableDefine>
    <orderColumns>
        <orderColumn orderType='desc'>id</orderColumn>
    </orderColumns>
    <bizFieldsMap>
        <bizFields key='createTime'>created</bizFields>
        <bizFields key='updateTime'>modified</bizFields>
        <bizFields
                key='queryList'>type,project_key,scope,config_key,config_value,ext1,ext2,ext3,creator</bizFields>
        <bizFields
                key='addList'>type,project_key,scope,config_key,config_value,ext1,ext2,ext3,creator</bizFields>
        <bizFields
                key='updateList'>type,project_key,scope,config_key,config_value,ext1,ext2,ext3,creator</bizFields>
        <bizFields
                key='viewList'>type,project_key,scope,config_key,config_value,ext1,ext2,ext3,creator</bizFields>
        <bizFields key='searchKey'>type,project_key,scope,config_key,config_value,ext1,ext2,ext3,creator</bizFields>
        <bizFields
                key='allColumn'>type,project_key,scope,config_key,config_value,ext1,ext2,ext3,creator</bizFields>
    </bizFieldsMap>

</tableModel>

操作步骤:

以上示例模板工程可以从git仓库中下载使用:

https://github.com/cn2oo8/molicode-template-study

参考study02目录下的模板文件。

展开阅读全文
加载中
点击加入讨论🔥(1) 发布并加入讨论🔥
1 评论
1 收藏
0
分享
返回顶部
顶部