诞生由来
之前项目里就经常有bean之间的属性copy,一直都是用spring自带的工具类来解决,方法如下:1
org.springframework.beans.BeanUtils#copyProperties(java.lang.Object, java.lang.Object);
该方法只能对一个bean中普通属性字段进行copy,如果这个bean中有其他的bean,即bean中bean,就需要将其值取出,单独对这个子bean进行copy,然后set进父bean,这种copy如果在bean层次少的时候还无所谓,如果在bean的层次比较深的时候,就会发现很是繁琐了,最近遇到的项目里面有bean和bo的转换,其深度就有四五层,所以如果能想出一个新的工具类,能够一次性copy其bean中bena肯定最好不过了。
以前用的简单包装工具类
- 满足单层bean的copy。
- 满足单层bean集合的copy。
1 | public class CopyUtil { |
通过反射写出的新的一套工具类
- 满足单层bean的copy。
- 满足单层bean集合的copy。
- 满足多层bean的复合copy。
思路
- 获取fromBean中的属性字段,如果toBean中也有其属性字段,则继续下一步。
- 反射执行get/is获取其属性field,得到属性类型type,属性值fieldValue。
- 如果type是普通类型,则直接反射执行set方法将值写入toBean。
- 如果type是List集合类型,调用getFieldIfList获取对应toBean中的该属性值toList:
- 获取这个List类型属性里面包裹的属性类型type_child。
- 如果type_child仍是List集合类型,递归调用getFieldIfList去掉List外壳,并将值add进其父List。
- 如果type_child不是集合类型,通过Class.forName获取其class:
- 如果type_child是一般类型,直接将传进来的list值add进toList返回。
- 如果type_child是child_bean类型,遍历传进来的list,对其每个值又重新调用copy方法set进new出来的新child_bean实例中,返回。
- 如果type是Map类型,暂不考虑。
如果type不是以上类型(忽略考虑了java里面或者其他类里面定义的内置bean类型),判定为bean中bean类型:
反射获取toBean中对应字段的class:
1
2Class<?> newToClass = toClass.getDeclaredField(field.getName()).getType();
Object newToBean = newToClass.newInstance();再次调用copy方法将fieldValue写入newToBean,然后执行set方法将newToBean写入toBean。
- 最终返回toBean即目标结果。
判断是否是普通字段属性
1 | /** |
整体工具类
1 | /** |
简单测试
1 |
|
main方法简单set值进行copy,打印对比测试:1
2Bean1(name=aaa, list=[Bean1_1(name=name0, id=6, testBean=[Bean1_1_1(age=17, birthday=Sun Sep 22 14:11:47 CST 2019), Bean1_1_1(age=16, birthday=Sun Sep 22 14:11:47 CST 2019)], success=true), Bean1_1(name=name1, id=0, testBean=[Bean1_1_1(age=15, birthday=Sun Sep 22 14:11:47 CST 2019), Bean1_1_1(age=15, birthday=Sun Sep 22 14:11:47 CST 2019)], success=true)], testBean=Bean1_2(test=100), aList=[a1, a2], bList=[[1, 2], [1, 2]], cList=[[Bean1_3(id=10), Bean1_3(id=10), Bean1_3(id=10)], [Bean1_3(id=11), Bean1_3(id=11), Bean1_3(id=11)]])
Bean2(name=aaa, list=[Bean2_1(name=name0, id=6, testBean=[Bean2_1_1(age=17, birthday=Sun Sep 22 14:11:47 CST 2019), Bean2_1_1(age=16, birthday=Sun Sep 22 14:11:47 CST 2019)], success=true), Bean2_1(name=name1, id=0, testBean=[Bean2_1_1(age=15, birthday=Sun Sep 22 14:11:47 CST 2019), Bean2_1_1(age=15, birthday=Sun Sep 22 14:11:47 CST 2019)], success=true)], testBean=Bean2_2(test=100), aList=[a1, a2], bList=[[1, 2], [1, 2]], cList=[[Bean2_3(id=10), Bean2_3(id=10), Bean2_3(id=10)], [Bean2_3(id=11), Bean2_3(id=11), Bean2_3(id=11)]])
结语
以上为博主应需写出的工具类,肯定不尽完美,读者发现有问题,可以提出来,博主很乐意一直完善该工具类~