Spring本身自带BeanUtils的复制方法,观察源代码可知是用反射方法获取对应字段名称后拷贝对应数据,也存在可自定义去掉空值字段的传递参数
但实际上如果一个实体类中字段过多,要一个一个传递这些空值字段名会显得数据过多,同样也能在复制前先用反射的方法来获取复制源的实体类中空值的字段,再传入这个方法中避免复制空值字段
public static String[] getNullPropertyNames (Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<String>();
for(java.beans.PropertyDescriptor pd : pds) {
Object srcValue = src.getPropertyValue(pd.getName());
if (srcValue == null) emptyNames.add(pd.getName());
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}
public static void copyPropertiesIgnoreNull2(Object src, Object target) {
BeanUtils.copyProperties(src, target, getNullPropertyNames(src));
}
主要考虑存在空值传递问题,这里改用hutool中的BeanUtil方法类复制
这里用到的依赖包hutool
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.4</version>
</dependency>
观察源码可知,方法和Spring的复制方法传递参数类似,但是用的BeanCopier的方法,如果处理简单复制的数据,速度会比BeanUtils的方法更快,同时提供是否忽略空值的参数,也不用自定义方法获取空值参数名集合,即BeanUtil使用的是CopyOptions用于复制对象属性的方法,提供可忽视空值的方法,使用起来更方便易懂
对比BeanUtils的方法可知仅设置对应的CoptOption后就可仅复制非空值的字段数据