BeanUtils.copyProperties方法的缺点以及如何使用反射完成两个对象属性的自动复制封装
1、org.springframework.beans.BeanUtils类中copyProperties的缺点
一般我们会使用此方法完成两个对象属性值的自动复制封装,但是如果资源对象a中的一个属性值为null,该方法也会将null值封装到目标对象b,导致目标对象b的该属性值也为null,此时落到数据库表中时,就算表的字段设置了默认值,此时也会为null值;所以需要进行手动判断,而反射就是最方便的方式;
2、通过反射实现两个对象属性的自动封装,并且过滤值为空的属性
直接上代码:
private static void copyPropeties(ResourceVo resourceVo, YsEntLabel target) {
try {
if(resourceVo != null && target!= null) {
// 通过反射获取对象的属性对象
Field[] fields1 = resourceVo.getClass().getDeclaredFields();
Field[] fields2 = target.getClass().getDeclaredFields();
// 遍历属性集合
for (int i = 0; i < fields1.length; i++) {
for (int j = 0; j < fields2.length; j++) {
if (fields1[i].getName().equals(fields2[j].getName())) {
// 对象中的属性都是私有的,不能直接获取到,通过setAccessible方法,暴力反射获取;
fields1[i].setAccessible(true);
fields2[j].setAccessible(true);
// 属性值不为空时才赋值
if (fields1[i].get(resourceVo) != null) {
fields2[j].set(target, fields1[i].get(resourceVo));
}
}
}
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}