前言

一般来说,我们在做项目时,为了更好的解耦,会把对象划分为VO,QO,ENEITY等,每个对象有不同的职责,那么其中不可避免的就会涉及到一些对象的互相转换,属性值的copy等,很早以前,是一个一个字段的去set,编码时得注意字段对应,当对象字段多时,开发效率影响很大,所以目前的开发习惯,很多都是采用工具类如BeanUtils来直接做对象的属性copy,但是不管是Spring的还是Apache的BeanUtils工具类,或者是其他相似的工具类,底层不是使用反射、就是是用代理以及序列化操作,对性能影响还是有的。

为什么有这个想法

回归原始,想想为什么此时要使用BeanUtils工具类,其实就是为了解决重复设值的麻烦,加速编码效率,那么如果有其他的方法能够让开发避免这种重复性工作,同时又能保证性能,那我们在对象转化的时候,是不是可以不用BeanUtils了,还能把性能再提高一点点。

实践方案

引入idea插件GenerateO2O以及GenerateAllSetter。
GenerateO2O:可以用来生成转换对象的方法。属性名字相同的可以直接转换,不用不停的写get、set方法做转换。
GenerateAllSetter:可以一键生成对象所有的set属性字段。

接着可以在实体定义静态转换方法,参考如下:

/**
     * qo转实体
     *
     * @param qo
     * @return
     */
    public static Entity convertToEntity(QO qo) {
        if (Objects.isNull(qo)) {
            return null;
        }
        Entity entity = new Entity();
        entity.setId(qo.getClientId());
        return entity;
    }

然后如果接下来qo对象要转实体,直接调用该方法即可,哪个对象要转哪个对象,具体静态方法就定义在要转换出的对象中即可。

GenerateO2O快捷键:基于mac,快捷键是command+n,如下:

beanutils copyproperties过滤父类属性 避免用beanutils进行属性copy_java

PS:GenerateO2O插件其实也存在一些问题,如存在漏属性的情况,不支持子对象的转化、不支持list泛型不同的转化,同类名出现问题,不过有付费插件Simple Object Copy可以解决这些问题,本篇文章主要是分享一种不用BeanUtils来拷贝属性的思路,做个记录,接下来我想尝试这种新方法的可行性,毕竟反射确实影响性能。