天天看點

比較兩個Bean是否相等

最近項目中,反複需要用到比較兩個Bean是否全等的情況,許多人都是一個元素一個元素的比下去

比較兩個Bean是否相等

,效率太低了。于是寫了一個用于比較兩個同構Bean的函數與大家分享,若有什麼更好的辦法也請不吝賜教。

/**
 * 比較兩個Bean中所有元素是否全等,是傳回True,有一個不等則傳回False<br/>
 * 參數的位置和結果無關
 * @param obj1 第一個Bean
 * @param obj2 第二個Bean
 * @return 是否全等的boolean值
 */
private boolean compareBeans(Object obj1, Object obj2) {

	if((null == obj1 && null != obj2) || (null != obj1 && null == obj2)) {
		return false;
	} else if(null == obj1 && null == obj2){
		return true;
	}
	Field[] fieldArr1 = obj1.getClass().getDeclaredFields();
	Field[] fieldArr2 = obj2.getClass().getDeclaredFields();
	if(fieldArr1.length != fieldArr2.length) {
		return false;
	} else {
		Field field1, field2;
		String typeName1, typeName2;
		Object tmpObj1, tmpObj2;
		for(int i = 0; i < fieldArr1.length; i++) {
			field1 = fieldArr1[i];
			field2 = fieldArr2[i];
			field1.setAccessible(true);
			field2.setAccessible(true);
			typeName1 = field1.getType().getName();
			typeName2 = field2.getType().getName();
			if(!StringUtils.equals(typeName1, typeName2)) {
				return false;
			}
			tmpObj1 = field1.get(obj1);
			tmpObj2 = field2.get(obj2);
			if((null == tmpObj1 && null != tmpObj2) || (null != tmpObj1 && null == tmpObj2)) {
				return false;
			} else if(null == tmpObj1 && null == tmpObj2){
				continue;
			}
			if(boolean.class.equals(typeName1)) {
				if(!((Boolean)tmpObj1).equals((Boolean)tmpObj2)) {
					return false;
				}
			} else if(double.class.equals(typeName1)) {
				if(!((Double)tmpObj1).equals((Double)tmpObj2)) {
					return false;
				}
			} else if(float.class.equals(typeName1)) {
				if(!((Float)tmpObj1).equals((Float)tmpObj2)) {
					return false;
				}
			} else if(int.class.equals(typeName1)) {
				if(!((Integer)tmpObj1).equals((Integer)tmpObj2)) {
					return false;
				}
			} else if(long.class.equals(typeName1)) {
				if(!((Long)tmpObj1).equals((Long)tmpObj2)) {
					return false;
				}
			} else if(char.class.equals(typeName1)) {
				if(!((Character)tmpObj1).equals((Character)tmpObj2)) {
					return false;
				}
			} else if(String.class.equals(typeName1)) {
				if(!((String)tmpObj1).equals((String)tmpObj2)) {
					return false;
				}
			} else {
				if(!(tmpObj1.toString().equals(tmpObj2.toString()))) {
					return false;
				}
			}
		}
	}
	return true;
}