在业务中,5000次的循环中复制对象(29个属性)223次,即111.5万次的复制。几种方式的耗时开销对比如下:
序号 | 方式 | 耗时 | 代码 | 备注 |
1 | 原始方式 | / | 繁琐 | 未测试,参考其他数据和高效相当 |
2 | 优雅方式 | 60 | 简洁 | / |
3 | 高效方式 | 3S | 简洁 | 普通和封装方式有个不到1S的差距 |
4 | 最佳方式 | 3S | 简洁 | / |
备注:业务中除复制对象也存在其他业务逻辑,但产生的耗时影响是相同的,不影响对比结果。
1原始方式
source对象getter + target对象setter
实现代码较为繁琐,性能较高。
2优雅方式
Hutool工具类
语法简洁,性能较低。
BeanUtil.copyProperties(source, target, false);
// ignoreCase:false表示当源对象的值为null时仍然注入,true表示当源对象的值为null时停止注入
3高效方式
使用Cglib
或对
Cglib自行封装工具类
性能较高。
BeanCopier copier = BeanCopier.create(TestItemConfig.class, CustomerTestData.class, false);
copier.copy(testItemConfig, customerTestData, null);
或
BeanCopierUtil.copy(testItemConfig, customerTestData);
public class BeanCopierUtil {
/**
* BeanCopier的缓存
*/
static final ConcurrentHashMap<String, BeanCopier> BEAN_COPIER_CACHE = new ConcurrentHashMap<>();
/**
* BeanCopier的copy
* @param source 源文件的
* @param target 目标文件
*/
public static void copy(Object source, Object target) {
String key = genKey(source.getClass(), target.getClass());
BeanCopier beanCopier;
if (BEAN_COPIER_CACHE.containsKey(key)) {
beanCopier = BEAN_COPIER_CACHE.get(key);
} else {
beanCopier = BeanCopier.create(source.getClass(), target.getClass(), false);
BEAN_COPIER_CACHE.put(key, beanCopier);
}
beanCopier.copy(source, target, null);
}
/**
* 生成key
* @param srcClazz 源文件的class
* @param tgtClazz 目标文件的class
* @return string
*/
private static String genKey(Class<?> srcClazz, Class<?> tgtClazz) {
return srcClazz.getName() + tgtClazz.getName();
}
}
<!-- CGLIB(Code Generator Library)是一个强大的、高性能的代码生成库。 -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
4最佳方式
Hutool封装Cglib的工具类CglibUti
性能较高。
// 对象拷贝
CglibUtil.copy(source, target);
// 集合拷贝
List<UserVO> userVOList = CglibUtil.copyList(userList, UserVO::new);
// 注意对象和集合不同的语法结构
<!-- CGLIB(Code Generator Library)是一个强大的、高性能的代码生成库。 -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
<!-- hutool util-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.11</version>
</dependency>