有时候会想对比两个对象中同名属性的值是否相同,但是如果对象属性数量过多,一个个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;
}