首页  编辑  

diff比较任意新老两个对象差异,返回相同属性值不同的新值列表

Tags: /Java/   Date Created:
比较任意两个对象,这两个对象可能类不同。
如果老对象为空,新对象不为空,则返回新对象所有的属性名和值的map对象和 "type": "add"
如果老对象不为空,新对象为空,则返回 "type": "delete"
如果新老对象不为空,则比对两个对象中,相同的属性,如果值不同, 则返回新对象的属性名和属性值和 "type": "update"的map对象。

  1.   /**
  2.    * Compare two object, and return new object diff key & value
  3.    *
  4.    * @param oldObject old object
  5.    * @param newObject new object
  6.    * @return Map key-value of new object if value not equals
  7.    */
  8.   @SuppressWarnings("rawtypes")
  9.   public static Map<StringObject> diffObject(Object oldObject, Object newObject) {
  10.     Map<StringObject> map = new HashMap<>();
  11.     if (oldObject == null && newObject == null) {
  12.       return map;
  13.     }
  14.     if (oldObject == null) {
  15.       map.put("type""add");
  16.     } else if (newObject == null) {
  17.       map.put("type""delete");
  18.       return map;
  19.     }
  20.     try {
  21.       // get all properties of new Object & oldObject
  22.       PropertyDescriptor[] newProperties = Introspector.getBeanInfo(newObject.getClass(), Object.class).getPropertyDescriptors();
  23.       PropertyDescriptor[] oldProperties = oldObject == null ? null : Introspector.getBeanInfo(oldObject.getClass(), Object.class).getPropertyDescriptors();
  24.       for (PropertyDescriptor newPD : newProperties) {
  25.         String name = newPD.getName();
  26.         Object newValue = newPD.getReadMethod().invoke(newObject);
  27.         if (newValue instanceof List) {
  28.           continue;
  29.         } else if (oldProperties == null) {
  30.           map.put(name, newValue);
  31.           continue;
  32.         }
  33.         // check if old object have the same name field, if not exists, skip it
  34.         PropertyDescriptor oldPD = Arrays.stream(oldProperties).filter(e -> e.getName().equals(name)).findFirst().get();
  35.         if (oldPD == null) {
  36.           continue;
  37.         }
  38.         Object oldValue = oldPD.getReadMethod().invoke(oldObject);
  39.         if (oldValue instanceof List) {
  40.           continue;
  41.         }
  42.         if (!ObjectUtils.nullSafeEquals(oldValue, newValue)) {
  43.           map.put("type""update");
  44.           map.put(name, newValue);
  45.         }
  46.       }
  47.     } catch (Exception e) {
  48.     }
  49.     return map;
  50.   }