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);
}
}
}
注意事项
- 如果遇到List泛型,即使泛型的类型不同,BeanCopier会复制(因为Java的泛型实际上是编译时,运行时就都编程List了)