Bean复制工具

2019-05-18  本文已影响0人  十毛tenmao

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

注意事项

参考

上一篇 下一篇

猜你喜欢

热点阅读