最近項目中,反複需要用到比較兩個Bean是否全等的情況,許多人都是一個元素一個元素的比下去
![](/image//images/smiles/icon_confused.gif)
,效率太低了。于是寫了一個用于比較兩個同構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;
}