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;
}
转载于:https://blog.51cto.com/5618698/1566285