public static String[] getNullPropertyNames(Object source) { final BeanWrapper src = new BeanWrapperImpl(source); java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors(); Set emptyNames = new HashSet(); 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 (String[]) emptyNames.toArray(result); }
时间: 2024-04-28 13:20:17 浏览: 156
这段代码是一个Java方法,用于获取一个对象中所有值为null的属性名。具体来说,该方法接收一个对象source作为参数,通过Java反射机制获取该对象中的所有属性描述对象PropertyDescriptor,然后通过BeanWrapper将source对象包装起来,进而获取source对象中每个属性的值。如果发现某个属性的值为null,就将该属性的名称添加到一个Set集合emptyNames中。最后,将emptyNames集合中的元素转化为一个字符串数组,作为该方法的返回值。
该方法的返回结果可以用于进行对象的空值属性判断,比如在进行对象复制或更新操作时,如果源对象中某些属性的值为null,就可以使用该方法获取这些属性的名称,然后将这些属性从目标对象中删除或保持不变,从而实现对非空属性的赋值更新。
相关问题
public static String[] getNullPropertyNames(Object source) { BeanWrapper beanWrapper = new BeanWrapperImpl(source); PropertyDescriptor[] pds = beanWrapper.getPropertyDescriptors(); List<String> nullPropertyNames = new ArrayList<>(); for (PropertyDescriptor pd : pds) { String propertyName = pd.getName(); if (beanWrapper.getPropertyValue(propertyName) == null) { nullPropertyNames.add(propertyName); } } return nullPropertyNames.toArray(new String[nullPropertyNames.size()]); }
这是一个 Java 方法,用于获取一个对象中所有属性值为 null 的属性名。它使用了 Java 的反射机制,通过 BeanWrapper 对象获取指定对象的所有属性描述符,然后遍历每个属性描述符,判断该属性的值是否为 null,如果为 null,则将该属性的名称加入到列表中。最后将列表转换为数组并返回。
需要注意的是,该方法依赖于 Spring Framework 的 BeanWrapper 和 PropertyDescriptor 类,因此需要在项目中引入 Spring 相关的依赖。
解读这段代码 @SuppressWarnings({ "unchecked" }) private Object updateProperty(Object source, Object target) { BeanWrapper src = new BeanWrapperImpl(source); BeanWrapper tar = new BeanWrapperImpl(target); String[] collectandnonullpropertynames = Util.getCollectandNoNullPropertyNames(source); if (collectandnonullpropertynames.length != 0) { for (int i = 0; i < collectandnonullpropertynames.length; i++) { List<Object> srclst = (List<Object>) src.getPropertyValue(collectandnonullpropertynames[i]); List<Object> tarlst = (List<Object>) tar.getPropertyValue(collectandnonullpropertynames[i]); if (srclst != null && tarlst != null) { /** 判断集合属性是否有增减,并执行相应的增减操作 */ List<Object> tobeaddedlst = subList(srclst, tarlst); List<Object> tobereducedlst = subList(tarlst, srclst); if (tobeaddedlst.size() > 0) { tarlst.addAll(tobeaddedlst); } if (tobereducedlst.size() > 0) { tarlst.removeAll(tobereducedlst); } /** 通过递归算法进行集合属性的深拷贝 */ srclst.forEach(subsource -> { Object subtarget = tarlst.stream().filter(subtaritem -> { return isSameById(subsource, subtaritem); }).findAny().orElseGet(null); if (subtarget != null) { /* 集合属性更新的递归调用 */ updateProperty(subsource, subtarget); } }); } } } else { /* 递归至最后一级无集合属性时执行的属性更新 */ BeanUtils.copyProperties(source, target, Util.getCollectandNullPropertyNames(source)); return target; } /* 当前级集合属性更新后执行的非集合属性更新 */ BeanUtils.copyProperties(source, target, Util.getCollectandNullPropertyNames(source)); return target; }
这段代码定义了一个方法`updateProperty`,它接受两个参数`source`和`target`,并返回一个`Object`类型的值。方法中使用了`@SuppressWarnings({ "unchecked" })`注解,表示忽略类型安全的警告。
接下来,方法中创建了两个`BeanWrapper`对象`src`和`tar`,用于访问`source`和`target`对象的属性。然后使用`Util.getCollectandNoNullPropertyNames(source)`方法获取`source`对象中非空属性的名称,并将它们存储在`collectandnonullpropertynames`数组中。
如果`collectandnonullpropertynames`数组不为空,方法会遍历数组中的每个属性名,依次将`source`和`target`对象中对应的属性值转换成`List<Object>`类型,并将它们分别存储在`srclst`和`tarlst`变量中。如果`srclst`不为空且`tarlst`为空,说明`target`对象中该属性的值为`null`,此时将`srclst`的值赋给`tarlst`;如果`srclst`和`tarlst`都不为空,说明`target`对象中该属性的值已经存在,此时将`srclst`的值添加到`tarlst`中。最后,方法返回`target`对象。
阅读全文