引言
由于有時(shí)會(huì)有需求,需要判斷人員信息是否有修改,因?yàn)槿藛T信息會(huì)有很多屬性董习,一個(gè)個(gè)的進(jìn)行if else難免會(huì)崩潰。因此爱只,本文通過反射來實(shí)現(xiàn)該功能皿淋。
正文
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中招刹,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法窝趣;對(duì)于任意一個(gè)對(duì)象疯暑,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語言的反射機(jī)制哑舒。
/**
* 獲取兩個(gè)對(duì)象同名屬性內(nèi)容不相同的列表
* @param class1 對(duì)象1
* @param class2 對(duì)象2
* @return
* @throws ClassNotFoundException
* @throws IllegalAccessException
*/
public static List<Map<String, Object>> compareTwoClass(Object class1, Object class2) throws ClassNotFoundException, IllegalAccessException {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
//獲取對(duì)象的class
Class<?> clazz1 = class1.getClass();
Class<?> clazz2 = class2.getClass();
//獲取對(duì)象的屬性列表
Field[] field1 = clazz1.getDeclaredFields();
Field[] field2 = clazz2.getDeclaredFields();
//遍歷屬性列表field1
for (int i = 0; i < field1.length; i++) {
//遍歷屬性列表field2
for (int j = 0; j < field2.length; j++) {
//如果field1[i]屬性名與field2[j]屬性名內(nèi)容相同
if (field1[i].getName().equals(field2[j].getName())) {
field1[i].setAccessible(true);
field2[j].setAccessible(true);
//如果field1[i]屬性值與field2[j]屬性值內(nèi)容不相同
if (!compareTwo(field1[i].get(class1), field2[j].get(class2))) {
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("name", field1[i].getName());
map2.put("old", field1[i].get(class1));
map2.put("new", field2[j].get(class2));
list.add(map2);
}
break;
}
}
}
return list;
}
獲取到兩個(gè)對(duì)象中屬性列表
遍歷對(duì)比
屬性名相同屬性值不同的把屬性名及兩個(gè)對(duì)象的屬性值保存進(jìn)Map
返回List
如果在使用過程中妇拯,會(huì)遇到null這種情況,因此洗鸵,大家要做好判斷
//對(duì)比兩個(gè)數(shù)據(jù)是否內(nèi)容相同
public static boolean compareTwo(Object object1, Object object2) {
if (object1 == null && object2 == null) {
return true;
}
//以下注掉代碼越锈,看具體需求。因有時(shí)會(huì)出現(xiàn)源數(shù)據(jù)是沒有進(jìn)行賦值膘滨,因此是null甘凭;而通過EditText獲取值的時(shí)候,雖然沒有值火邓,但是會(huì)變成""丹弱,但是本質(zhì)是沒有賦值的。
//if (object1 == "" && object2 == null) {
// return true;
//}
//if (object1 == null && object2 == "") {
// return true;
// }
if (object1 == null && object2 != null) {
return false;
}
if (object1.equals(object2)) {
return true;
}
return false;
}