业务开发中,时常会遇到不同Model之间属性拷贝的问题,即模型转换问题,实现方式很多,其中最简单的是纯手工get再set,但耗时耗力代码丑陋,一般开发者会选择工具来完成自动的拷贝,但对工具内部逻辑和坑知之甚少,这也是面试中经常出现一问就懵的原因,因为既没有深度,也没有广度。
一、属性拷贝需要考虑的因素
- 拷贝的性能
- 不同类型拷贝时的处理逻辑
- 属性不存在时的默认处理逻辑
- 属性拷贝的时机和原理
- 需要浅拷贝还是深拷贝
二、拷贝工具技术分类
根据不同属性映射时机,主要分为在静态编译是和动态运行时2类。静态编译时,对编译速度有少许影响,但是不影响运行性能;动态运行时,则恰好相反。
-
静态编译时:字节码编辑技术
-
mapstruct
-
javapoet
-
Google AutoService
-
-
动态运行时:反射技术
-
apache-common
-
spring
-
hutool
-
Dozer
-
三、拷贝工具分析
动态运行时
1. apache-common
1)主要利用BeanUtils.copyProperties(source, target)
和PropertyUtils.copyProperties(target, source)
。2者的区别是,前者更被常