针对不同类型的对象,但有相同名称的属性,对象属性拷贝方法:
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是修改字节码。