比较两个具有相同属性的对象,判断内容是否相同
今天遇到一个需求,需要将页面传递的值和数据库里的参数进行比较,判断是否进行过修改,因为页面涉及到多个表的数据,字段非常多,if-else非常不合适,所以查找学习了一下
实现的方式:
public boolean compareTwoObject(Object class1, Object class2) {
// 获取对象class
Class<?> clazz1 = class1.getClass();
Class<?> clazz2 = class2.getClass();
// 获取类中所有声明的字段
Field[] fields1 = clazz1.getDeclaredFields();
Field[] fields2 = clazz2.getDeclaredFields();
// 遍历
for (int i=0;i<fields1.length;i++) {
for(int j=0;j<fields2.length;j++) {
/*简单比较,如果两字段名称一致,就认为是同一个字段
,默认考虑字段定义的类型一致*/
if(fields1[i].getName().equals(fields2[j].getName())){
// 将字段设置成可通过反射访问
fields1[i].setAccessible(true);
fields2[j].setAccessible(true);
// 比较内容
if(!compareTwo(fields1[i],fields2[j])) {
// 有修改
return false;
}
// 当前字段名称已经找到,直接终止最内层for循环,开始下一轮字段的匹配
break;
}
}
}
}
private boolean compareTwo(Object object1, Object object2) {
// 如果两字段都为空,也认为相等
if (object1 == null && object2 == null){
return true;
}
// 视情况而定,正常页面表单没有填写数据,传到后台时是null
// 但同一条信息,数据库里应该存的是""
if (object1 == null && object2 == "") {
return true;
}
// 比较内容
if(object1.equals(object2)) {
return true;
}
return false;
}