有时候会想对比两个对象中同名属性的值是否相同,但是如果对象属性数量过多,一个个if语句写着就烦,如果是能够有个通用的方法把对象传进去就可以给你return不同属性值的列表出来是有多好?
当时就是这个想法,然后就开始考虑如何下手,由于语言是java,所以想到了java的反射机制,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性
获取到两个对象中属性列表,
遍历对比,
属性名相同属性值不同的把属性名及两个对象的属性值保存进Map<String,Object>里,
返回List<Map<String,Object>
由于 xx.equal(null) 的值有两种情况
/**
* 获取两个对象同名属性内容不相同的列表
* @param class1 对象1
* @param class2 对象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>>();
//获取对象的class
Class<?> clazz1 = class1.getClass();
Class<?> clazz2 = class2.getClass();
//获取对象的属性列表
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]属性名内容相同
if(field1[i].getName().equals(field2[j].getName())){
if(field1[i].getName().equals(field2[j].getName())){
field1[i].setAccessible(true);
field2[j].setAccessible(true);
//如果field1[i]属性值与field2[j]属性值内容不相同
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;
}
如果xx为null,则出现空指针异常
如果xx不为null,则return false;
所以为了程序能够顺利运行,需要自定义一个属性值对比方法
/**
* 对比两个数据是否内容相同
*
* @param object1,object2
* @return boolean类型
*/
public static boolean compareTwo(Object object1,Object object2){
if(object1==null&&object2==null){
return true;
}
if(object1==null&&object2!=null){
return false;
}
if(object1.equals(object2)){
return true;
}
return false;
}