一、引言
常用的拷贝方式:
- 手动get&set实现。
- 通过Cglib的BeanCopier实现。
- 通过Apache的BeanUtils实现。
- 通过Apache的PropertyUtils实现。
- 通过Spring的BeanUtils实现。
(此模块先对常用拷贝方式进行总结,后文会详细介绍深拷贝&浅拷贝的区别以及实现方式。)
二.常用拷贝方式之间的区别
1. 手动get&set实现:
简单,粗暴,高性能
2. 通过Cglib的BeanCopier实现(使用动态代理,效率高):
不使用类型转换器:
BeanCopier beanCopier = BeanCopier.create(SourceClass.class, TargetClass.class, false); 前赋后
beanCopier.copy(sourceClass, targetClass, null);
不支持不同类型字段的转换,但可通过自己实现的converter转换器实现类型之间的转换。
使用类型转换器:
BeanCopier beanCopier = BeanCopier.create(SourceClass.class, TargetClass.class, true); 前赋后
beanCopier.copy(sourceClass, targetClass, converter); //converter为自己实现的转换器。
例如:
public class Long2StringConvert implements Converter {
@Override
public Object convert(Object sourceValue, Class targetClass, Object methodName) {
if( null != sourceValue && sourceValue.getClass().equals(Long.class) && targetClass.equals(String.class)) {
return String.valueOf(sourceValue);
}
return sourceValue;
}
}
生成用于复制两个类的BeanCoper类:
public final static BeanCopier dir2DirVOCopier = BeanCopier.create(Dir.class,DirVO.class,true);
执行拷贝:
BeanCopyProvider.dir2DirVOCopier.copy(dir, vo, new Long2StringConvert());
参考文档:
CGLIB中BeanCopier源码实现 - 简书 // CGLIB中BeanCopier源码实现
对象拷贝类PropertyUtils,BeanUtils,BeanCopier的技术沉淀(1)------功能简介_express_wind的专栏-CSDN博客
对象拷贝类PropertyUtils,BeanUtils,BeanCopier的技术沉淀(2)------缺陷预防_express_wind的专栏-CSDN博客
3. 通过Apache的BeanUtils实现(反射机制):
使用:BeanUtils.copyProperties(targetClass, sourceClass); 后赋前
提供自动转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换。
BeanUtils支持的转换类型如下:
* java.lang.BigDecimal
* java.lang.BigInteger
* boolean and java.lang.Boolean
* byte and java.lang.Byte
* char and java.lang.Character
* java.lang.Class
* double and java.lang.Double
* fl