对于数据有修改前和修改后 那么如何判断修改数据是否已发生改变而且取到修改的数据呢?-----利用反射 大大降低代码冗余度
1、关于反射
下面就直接上工具类代码:
public class JudgeAttributesIsEqualedUtil {
/**
* @param beginModel 旧数据model
* @param afterModel 新数据model
* @return 返回新数据和旧数据的map集合
*/
public static Map<String, Map<String, Object>> judgeAttributesIsEqual(Object beginModel, Object afterModel) {
/**
* 创建两个个Map<String,Object>
* 分别存储改动前 改动后的数据
*/
Map<String, Object> beginMap = new HashMap<>(16);
Map<String, Object> afterMap = new HashMap<>(16);
Map<String, Map<String, Object>> list = new HashMap<>(16);
/**
* model换成需要遍历的实体
* 获取实体类的所有属性,返回Field数组
*/
Field[] field = beginModel.getClass().getDeclaredFields();
Field[] field2 = afterModel.getClass().getDeclaredFields();
try {
// 遍历所有属性
for (int i = 0; i < field.length; i++) {
// 获取属性的名字
String name = field[i].getName();
// 将属性的首字符大写,方便构造get,set方法
name = name.substring(0, 1).toUpperCase() + name.substring(1);
for (int j = 0; j < field2.length; j++) {
// 获取属性的名字
String name2 = field2[j].getName();
// 将属性的首字符大写,方便构造get,set方法
name2 = name2.substring(0, 1).toUpperCase() + name2.substring(1);
if ("Id".equals(name)) {
break;
}
//判断属性名是否相同
if (name.equals(name2)) {
Method m = beginModel.getClass().getMethod("get" + name);
Method m1 = afterModel.getClass().getMethod("get" + name2);
// 调用getter方法获取属性值
Object value = m.invoke(beginModel);
Object value2 = m1.invoke(afterModel);
/**
* 判断属性值是否相等 相等则跳出当前循环执行下一个属性对比
* 不想等存储相关数据同时进行下一个属性比较
*/
if (value == null || value2 == null) {
break;
}
if (value.toString().equals(value2.toString())) {
break;
} else {
beginMap.put(name, value);
afterMap.put(name, value2);
break;
}
}
}
}
list.put("old", beginMap);
list.put("new", afterMap);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return list;
}