判断两个对象相等的工具类

public static boolean isObjectValueEqual(Object sourceObject,
   Object destObject) {
  try {
   return compare(sourceObject, destObject, true);
  } catch (IllegalArgumentException e) {
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   e.printStackTrace();
  }
  return false;
 }
 
 private static boolean compare(Object sourceObject, Object destObject,
   boolean deepCom) throws IllegalArgumentException,
   IllegalAccessException {
  boolean isEquals = false;
  if (sourceObject == null && destObject == null) {
   isEquals = true;
  } else if ((sourceObject != null && destObject == null)
    || (sourceObject == null && destObject != null)) {
   isEquals = setIsEquals(false, sourceObject);
  } else if (sourceObject.getClass() != destObject.getClass()) {
   isEquals = setIsEquals(false, sourceObject);
  } else if (deepCom) {
   if (sourceObject.equals(destObject)) {
    isEquals = true;
   } else if (sourceObject instanceof Map) {
    Map<Object, Object> obj1 = (Map<Object, Object>) sourceObject;
    Map<Object, Object> obj2 = (Map<Object, Object>) destObject;
    if (obj1.size() != obj2.size()) {
     isEquals = setIsEquals(false, obj1);
    } else {
     for (Object key : obj1.keySet()) {
      if (!obj2.keySet().contains(key)) {
       isEquals = false;
       break;
      }
      isEquals = setIsEquals(
        compare(obj1.get(key), obj2.get(key), true),
        obj1.get(key));
      if (!isEquals)
       break;
     }
    }

   } else if (sourceObject instanceof List) {
    List<Object> obj1 = (List<Object>) sourceObject;
    List<Object> obj2 = (List<Object>) destObject;
    if (obj1.size() != obj2.size()) {
     isEquals = setIsEquals(false, obj1);
    } else {
     for (int i = 0; i < obj1.size(); i++) {
      isEquals = setIsEquals(
        compare(obj1.get(i), obj2.get(i), true),
        obj1.get(i));
      if (!isEquals)
       break;
     }
    }
   } else if (sourceObject instanceof Queue) {
    if (((Queue) sourceObject).isEmpty()
      && ((Queue) destObject).isEmpty()) {
     isEquals = true;
    } else {
     Queue<Object> obj1 = (Queue<Object>) sourceObject;
     Queue<Object> obj2 = (Queue<Object>) destObject;
     if (obj1.size() != obj2.size()) {
      isEquals = setIsEquals(false, obj1);
     } else {
      int size = obj1.size();
      for (int i = 0; i < size; i++) {
       isEquals = setIsEquals(
         compare(obj1.poll(), obj2.poll(), true),
         obj1);
       if (!isEquals)
        break;
      }
     }
    }
   } else if (sourceObject instanceof Object[]) {
    Object[] obj1 = (Object[]) sourceObject;
    Object[] obj2 = (Object[]) destObject;
    if (obj1.length != obj2.length) {
     isEquals = setIsEquals(false, obj1);
    } else {
     for (int i = 0; i < obj1.length; i++) {
      isEquals = setIsEquals(compare(obj1[i], obj2[i], true),
        obj1[i]);
      if (!isEquals)
       break;
     }
    }
   } else {
    Class<? extends Object> clazz = sourceObject.getClass();
    Field[] fields = clazz.getDeclaredFields();
    for (Field field : fields) {
     field.setAccessible(true);
     Object obj1 = field.get(sourceObject);
     Object obj2 = field.get(destObject);
     if (obj1 != null
       && obj2 != null
       && (obj1 instanceof DataPaging || obj1 instanceof Government
         || obj1 instanceof AbstractGFSSummary
         || obj1 instanceof GFSReferencable
         || obj1 instanceof Map
         || obj1 instanceof List || obj1 instanceof Object[])) {
      isEquals = setIsEquals(compare(obj1, obj2, true), obj1);
     } else {
      isEquals = setIsEquals(compare(obj1, obj2, false), obj1);
     }
     if (!isEquals)
      break;
    }
   }
  } else {
   isEquals = setIsEquals(sourceObject.equals(destObject),
     sourceObject);
  }
  return isEquals;
 }
private static boolean setIsEquals(boolean equals, Object object) {
  if (!equals) {
   try {
    throw new Exception("The objects are not equal: " + object);
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  return equals;
 }

你可能感兴趣的:(java)