概要
使用BeanUtils.copyProperties只拷贝源对象为非空的数据,防止源对象null覆盖目标对象对应值。
技术名词解释
- BeanUtils.copyProperties
/**
参数1:目标对象(destination)这是要将属性值复制到的目标对象。通常是一个新创建的对象,以便将源对象的属性值复制到其中。
参数2:源对象(source)这是要从中复制属性值的源对象。
参数3:可选属性名数组(ignoreProperties)这是一个可选的字符串数组,指定要忽略复制的属性名称。如果指定了该参数,BeanUtils.copyProperties方法将不会复制在此数组中列出的属性。
*/
BeanUtils.copyProperties(source, target, getNullPropertyNames(source));
- BeanWrapper
//我们就可以通过BeanWrapper访问Bean的属性和方法
final BeanWrapper src = new BeanWrapperImpl(source);
- getPropertyDescriptors()
//方法用于获取的类的属性,但是获取的属性不是类的成员变量。
java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
- src.getPropertyValue(pd.getName())
//根据名称获取属性值
Object srcValue = src.getPropertyValue(pd.getName());
代码
/**
* 只拷贝源对象为非空的数据,防止源对象null覆盖目标对象对应值
* @param source 源对象
* @param target 目的对象
*/
public static void copyProperties(Object source, Object target){
BeanUtils.copyProperties(source, target, getNullPropertyNames(source));
}
/**
* 获取对象中为null的字段名
* @param source 待获取的对象
* @return
*/
public static String[] getNullPropertyNames(Object source){
final BeanWrapper src = new BeanWrapperImpl(source);
java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<>();
for (java.beans.PropertyDescriptor pd : pds){
try {
Object srcValue = src.getPropertyValue(pd.getName());
if (srcValue == null) emptyNames.add(pd.getName());
}catch (Exception e){
continue;
}
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}