convert代码自动生成器

简介: 背景:日常工作中我们经常会遇到在属性值大体相同的情况下要把数据实体类在bo, po, model,vo,dto之间进行相互的转化,需要我们无脑的写一些恶心至极的convert,那我们为什么不写个工具去生成这些无聊的代码,提高我们编码的效率呢。注意事项:仅仅转化字段名和字段类型相同的字段,不同的会在代码前添加“//TODO”的注释,并且暂时不涉及父类字

背景:

日常工作中我们经常会遇到在属性值大体相同的情况下要把数据实体类在bo, po, model,vo,dto之间进行相互的转化,需要我们无脑的写一些恶心至极的convert,那我们为什么不写个工具去生成这些无聊的代码,提高我们编码的效率,来好让我们更好的去摸鱼呢,哦错了,去内卷呢QAQ。

注意事项:

仅仅转化字段名和字段类型相同的字段,不同的会在代码前添加“//TODO”的注释,并且暂时不涉及父类字段,后续会加上;

使用方法: 

1.在main函数中给source和target赋值;

source:当前对象类型

target:要转化成的对象类型

2.运行main函数就会生成xxxxConvert.java文件到项目目录下。

例如:

source是UserDO, target是UserModel 就是生成将UserDO转化成UserModel的convert;

生成的convert就是这种格式:

className -> UserConvert

public UserMode convertModel(UserDO userDO) {

UserModel userModel = new UserModel();

.........

userModel.setXXX(userDO.getXXX); // 存在字段

........

// TODO SOURCE NO FIELD

userModel.setXXX(userDO.getXXX); // 不匹配的字段

........

return userModel;

}

下面请看代码:

package util;

import model.UserDO;
import model.UserModel;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;

/**
 * java 系统变量
 * https://zhuanlan.zhihu.com/p/441691521
 */

public class ConvertUtil {
    private static final String SPACE = " ";
    private static final String ENTER = System.getProperty("line.separator");
    private static final String ENTER_TABLE = ENTER + "\t";
    private static final String EQUAL = " = ";
    private static final String POINT = ".";
    private static final String GET = "get";
    private static final String SET = "set";
    private static final String NEW = "new ";
    private static final String BRACKETS = "()";
    private static final String FILE_PATH = System.getProperty("user.dir") + System.getProperty("file.separator");
    private static final String FILE_NAME = "Convert.java";

    public static void main(String[] args) throws IOException {

        Class source = UserDO.class;
        Class target = UserModel.class;

        // 方式一: 生成字符串
        String s = generateConvertContent(source, target);
        System.out.println(s);
        // 方式二: 生成文件 默认生成的文件在项目的一级目录下和pom同层次
        // parm1:source
        // parm2:target
        generateConvertFile(source, target);
    }

    /**
     *
     * @param source
     * @param target
     * @throws IOException
     */
    private static void generateConvertFile(Class source, Class target) throws IOException {
        String targetName = firstCharContrary(target.getSimpleName());
        String className = "";
        for (char c : targetName.toCharArray()) {
            if (Character.isUpperCase(c)) {
                int i = targetName.indexOf(c);
                className = targetName.substring(0, i);
                targetName = targetName.substring(i);
                break;
            }
        }
        String converMethodName = "converTo" + targetName;
        String convertMethod = "public" + SPACE + target.getSimpleName() + SPACE + converMethodName + SPACE
                + "(" + source.getSimpleName() + SPACE + firstCharContrary(source.getSimpleName()) + ")";
        String s = generateConvertContent(source, target);
        s = convertMethod + "{" + ENTER_TABLE + s + ENTER +"}";

        FileWriter fw = new FileWriter(FILE_PATH + firstCharContrary(className) + FILE_NAME);
        fw.write(s.trim());
        fw.close();
    }

    /**
     * 默认传入和返回变量名
     * @param source
     * @param target
     * @return
     */
    private static String generateConvertContent(Class source, Class target) {
        String sourceName = firstCharContrary(source.getSimpleName());
        String targetName = firstCharContrary(target.getSimpleName());
        return generateConvertContent(source, target, sourceName, targetName);
    }

    /**
     *
     * @param source
     * @param target
     * @param sourceName 传入变量名
     * @param targetName 返回变量名
     * @return
     */
    private static String generateConvertContent(Class source, Class target, String sourceName, String targetName) {
        StringBuilder result = new StringBuilder();
        Field[] sourceDeclaredFields = source.getDeclaredFields();
        Field[] targetDeclaredFields = target.getDeclaredFields();

        result.append(getConvertNewObjectLine(target, targetName));

        for (Field field : targetDeclaredFields) {
            if (!getField(field, sourceDeclaredFields)) {
                result.append(getConvertTODOLine());
            }
            result.append(getConvertFieldLine(sourceName, targetName, field.getName()));
        }

        return result.toString();
    }

    private static Boolean getField(Field target, Field[] fields) {
        for (Field field : fields) {
            if (field.getName().equals(target.getName())
                    && field.getType().equals(target.getType())) {
                return Boolean.TRUE;
            }
        }
        return Boolean.FALSE;
    }

    private static String getConvertNewObjectLine(Class target, String targetName) {
        return target.getSimpleName() + SPACE + targetName + EQUAL + NEW
                +target.getSimpleName() + BRACKETS + ENTER_TABLE;
    }

    private static String getConvertTODOLine() {
        return "//TODO SOURCE NO FIELD" + ENTER_TABLE;
    }

    private static String getConvertFieldLine(String sourceName, String targetName, String fieldName) {
        return targetName + POINT + SET + firstCharContrary(fieldName)
                + "(" + sourceName + POINT + GET + firstCharContrary(fieldName) + BRACKETS + ")"
                + ENTER_TABLE;
    }

    private static String firstCharContrary(String fieldName) {
        char[] chars = fieldName.toCharArray();
        chars[0] = toContraryCase(chars[0]);
        return String.valueOf(chars);
    }

    private static char toContraryCase(char c) {
        if ('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z') {
            c ^= 32;
        }
        return c;
    }
}

相关文章
|
20天前
|
编译器 Go API
go generate指南:代码自动生成
go generate指南:代码自动生成
759 0
|
20天前
|
C# Python
如何让 StyleCop 忽略 refit 自动生成的代码
创建自定义规则:我们需要创建一个自定义规则,该规则将用于排除特定类型的代码,我们可以创建一个自定义规则,用于检查类名是否以大写字母开头,然后忽略符合此规则的代码。
|
10月前
|
SQL 关系型数据库 MySQL
使用IntelliJ IDEA连接数据库,快速创建实体类对象,自动生成get,set,toString方法以及无参有参构造器
使用IntelliJ IDEA连接数据库,快速创建实体类对象,自动生成get,set,toString方法以及无参有参构造器
|
20天前
|
JSON 数据库 数据格式
gorm 教程三 gen自动代码生成工具
gorm 教程三 gen自动代码生成工具
202 0
|
10月前
|
Java Android开发
eclipse去掉try-catch,构造方法,get,set方法等里面自动生成的注释
eclipse去掉try-catch,构造方法,get,set方法等里面自动生成的注释
69 0
|
11月前
|
数据库
代码自动生成工具实战-Cursor
之前看过github copilot 的代码生成能力。可以说解放了码农的双手,基础的代码完全可以来生成。可是后来它收费了。
180 0
|
11月前
|
SQL 数据可视化 搜索推荐
自动生成HQL代码的工具
本文介绍了一个可视化工具,可以通过界面增删指标并快速选择指标类型,实现快速指标更改增删,将原本1小时的工作量缩减到1分钟,提高开发效率。同时,工具可以保存配置信息快照,方便复用,并且不依赖于第三方编程语言的运行环境,降低了用户使用难度。主界面包括表的基本信息、执行按钮、代码显示窗口和表配置标签,支持一次性生成多个不同表的代码。
121 0
|
JSON 自然语言处理 前端开发
前端实战-根据JSON文件自动生成对应的interface
前端实战-根据JSON文件自动生成对应的interface
380 0
|
JSON Android开发 数据格式
|
分布式计算 Hadoop 开发者
序列化案例 Debug 调试| 学习笔记
快速学习序列化案例 Debug 调试
279 0