针对不同类型的对象,但有相同名称的属性,对象属性拷贝方法:
1)org.apache.commons.beanutils.BeanUtils属性拷贝的本质使用反射。
2)org.springframework.beans.BeanUtils属性拷贝本质使用反射。
3)自己写的反射进行对象复制。
4)直接使用get、set方法复制。
5)cglib的BeanCopier。
效率对比:
属性拷贝方式 |
次数 |
10 |
100 |
1000 |
10000 |
100000 |
1000000 |
10000000 |
ApacheBeanUtilsCopyService |
总耗时 |
143 |
167 |
398 |
969 |
4029 |
18037 |
152364 |
单次耗时 |
14.3 |
1.67 |
0.398 |
0.0969 |
0.04029 |
0.018037 |
0.0152364 |
|
SpringBeanUtilsCopyService |
总耗时 |
239 |
222 |
503 |
434 |
340 |
427 |
2257 |
单次耗时 |
23.9 |
2.22 |
0.503 |
0.0434 |
0.00340 |
0.000427 |
0.0002257 |
|
SelfReflectCopyService |
总耗时 |
1 |
9 |
62 |
190 |
428 |
2377 |
26648 |
单次耗时 |
0.1 |
0.09 |
0.062 |
0.0190 |
0.00428 |
0.002377 |
0.0026648 |
|
SelfGetSetCopyService |
总耗时 |
0 |
0 |
1 |
2 |
12 |
22 |
109 |
单次耗时 |
0 |
0 |
0.001 |
0.0002 |
0.00012 |
0.000022 |
0.0000109 |
|
CglibBeanCopyService |
总耗时 |
142 |
128 |
179 |
195 |
297 |
475 |
1856 |
单次耗时 |
14.2 |
1.28 |
0.179 |
0.0195 |
0.00297 |
0.000475 |
0.0001856 |
这么看自己通过get/set方法(SelfGetSetCopyService)拷贝对象效率是最高的,但是开发效率比较低,因为相当于为具体的对象写的定制方法,不通用是硬伤。
如果不想手写那么多的get/set,推荐使用spring的BeanUtils.copyProperteis方法或者Cglib的BeanCopier,效率不错。
效率最低的是common包里的BeanUtils.copyProperteis方法。
现有工具类中对象属性拷贝都是浅拷贝,意味着引用类型的属性值的变更会引起其他对象值的变更。
关联代码:https://blog.csdn.net/SJZYLC/article/details/81203392
Apache和spring的底层都是用的反射。cglib是修改字节码。