美文网首页
Bean复制工具

Bean复制工具

作者: 十毛tenmao | 来源:发表于2019-05-18 08:01 被阅读0次

Java因为是静态语言,所以要增加属性时,不能像动态语言那样,直接在对象上增加一个属性。而是需要修改原来的类,或者新增一个类。 但是这样又会带来很多麻烦,因为很多数据(如DO,DTO,VO)需要复制,如果一个属性一个属性的复制,编码的效率很低,而且在属性变化时,容易漏掉。 所以在实际项目中,我们可以考虑使用BeanCopier来实现POJO在不同类之间的复制

经过对比功能和性能,最后选用了Cglib BeanCopier(功能完善,而且性能最高),但是项目中一般都是Spring,我们就使用了Spring实现的org.springframework.cglib.beans.BeanCopier

Bean复制工具

因为BeanCopier的创建比较耗时,所以我们会缓存所有的BeanCopier

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import org.springframework.cglib.beans.BeanCopier;

public class BeanCopierUtil {
    private static final Table<Class, Class, BeanCopier> BEAN_COPIER_TABLE = HashBasedTable.create();

    public static <T, R> R copy(T t, Class<R> klass) {
        BeanCopier beanCopier = BEAN_COPIER_TABLE.get(t.getClass(), klass);
        if (beanCopier == null) {
            beanCopier = BeanCopier.create(t.getClass(), klass, false);
            BEAN_COPIER_TABLE.put(t.getClass(), klass, beanCopier);
        }
        try {
            R r = klass.newInstance();
            beanCopier.copy(t, r, null);
            return r;
        } catch (InstantiationException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}

注意事项

  • 如果遇到List泛型,即使泛型的类型不同,BeanCopier会复制(因为Java的泛型实际上是编译时,运行时就都编程List了)

参考

相关文章

网友评论

      本文标题:Bean复制工具

      本文链接:https://www.haomeiwen.com/subject/femaaqtx.html