Java:对比一个对象更新前后具体被修改了哪些值
Java:对比一个对象更新前后具体被修改了哪些值
Zyyyyu 的个人博客
遇到一个需求就是要记录每行数据被修改更新后,要记录下当前值和修改前的值
那有人就会说写个if去判断值是否被修改了,然后记录下来不就行了,这是一个思路,但只适用于该类的字段少的情况,而类的字段如果很多甚至几十上百个时,不可能挨个去写,且每次新增新的字段就需要再增加逻辑,所以该思路就会被直接pass掉。
思路讲解
既然没办法通过if去判断,那么还有一种办法,那就是通过反射去拿到这个类中所有字段,然后遍历这个类每个字段是否被修改,如果修改则记录下其值和字段名,下面的方法适用于所有类,所以基本是copy就可以用,以下为代码:
/**
* 获取实体类被修改的字段名
*
* @param clazz
* @param obj1
* @param obj2
* @return
*/
private static List<String> getVariableNames(Class clazz, Object obj1, Object obj2) {
// 存储被修改的字段名
List<String> modifyFields = new ArrayList<>();
try {
// 解析对象1和对象2的JSONObject
JSONObject object1 = JSONUtil.parseObj(obj1);
JSONObject object2 = JSONUtil.parseObj(obj2);
// 获取该类的所有属性
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// 设置属性可访问
field.setAccessible(true);
// 获取属性名
String name = field.getName();
// 判断对象1和对象2的属性数量是否不为0(如果是创建则object2为null)
if (object1.size() != 0 && object2.size() != 0) {
// 判断对象1和对象2的属性值是否都不为空(由于有一些属性始终为null,所以需要过滤掉,不然会空指针异常)
if (StringUtils.isNotNull(object1.get(name)) && StringUtils.isNotNull(object2.get(name))) {
// 判断对象1和对象2的属性值是否不相等
if (!object1.get(name).equals(object2.get(name))) {
// 添加属性名到列表中
modifyFields.add(field.getName());
}
// 判断对象1属性值为空且对象2的属性值不为空(说明原先为赋值,后续赋值)
} else if (StringUtils.isNull(object1.get(name)) && StringUtils.isNotNull(object2.get(name))) {
modifyFields.add(field.getName());
// 判断对象1属性值不为空且对象2的属性值为空(说明原先为赋值,后续删除)
} else if (StringUtils.isNotNull(object1.get(name)) && StringUtils.isNull(object2.get(name))) {
modifyFields.add(field.getName());
}
}
}
} catch (Exception e) {
// 获取异常信息详情
String exceptionMessage = ExceptionUtil.getExceptionDetailMessage(e);
logger.error("获取被修改的字段名失败:{}", exceptionMessage);
}
return modifyFields;
}
结论:
该方法是可实现的,如果要在数据库中存储这些被修改的字段名和值,这里还有个思路就是json,将修改前后的对象转为JSON存储到数据库,同时再用一个list记录被修改的字段名,如果需要的时候直接遍历去get两个json里面的值就可以了,也许会有更好的办法去实现,但是该方法是比较适用于我目前的项目,如果有更好的的办法可以在评论区下留言,互相学习。
原文地址:https://blog.csdn.net/warneraop/article/details/140544182
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!