首页  编辑  

SpringBoot复制对象同名属性类似克隆Clone

Tags: /Java/   Date Created:
复制对象的属性值,可以是相同类型对象,也可以是不同类型对象,主要是同名属性的赋值
警告:
  • 尽量不要用于不同类型的属性复制
  • 不同类型的对象,同名的属性,如果类型不同,很可能无法复制
  • 属性的名字大小写必须完全相同才能复制

  1. import org.springframework.beans.BeanUtils;
  2. import org.springframework.beans.BeanWrapper;
  3. import org.springframework.beans.BeanWrapperImpl;
  4. import java.beans.PropertyDescriptor;
  5. import java.util.HashSet;
  6. import java.util.Objects;
  7. import java.util.Set;
  8. /**
  9.  * Copy bean utility class
  10.  */
  11. public class CopyBeanUtils {
  12.   private CopyBeanUtils() {
  13.     throw new IllegalStateException("Utility class");
  14.   }
  15.   /**
  16.    * All attributes with null values are not copied
  17.    *
  18.    * @param source source object
  19.    * @param target target object
  20.    */
  21.   public static void copyNonNullPropertites(Object source, Object target) {
  22.     BeanUtils.copyProperties(source, target, getNullField(source));
  23.   }
  24.   /**
  25.    * Get fields that are empty in the property
  26.    *
  27.    * @param source source object
  28.    * @return array name of null fields
  29.    */
  30.   private static String[] getNullField(Object source) {
  31.     BeanWrapper beanWrapper = new BeanWrapperImpl(source);
  32.     PropertyDescriptor[] propertyDescriptors = beanWrapper.getPropertyDescriptors();
  33.     Set<String> notNullFieldSet = new HashSet<>();
  34.     for (PropertyDescriptor p : propertyDescriptors) {
  35.       String name = p.getName();
  36.       Object value = beanWrapper.getPropertyValue(name);
  37.       if (Objects.isNull(value)) {
  38.         notNullFieldSet.add(name);
  39.       }
  40.     }
  41.     String[] notNullField = new String[notNullFieldSet.size()];
  42.     return notNullFieldSet.toArray(notNullField);
  43.   }
  44. }