视频网站直播怎么做的,学做网站论坛教程,下载别人dede网站模版,二级网站建设规范Java#xff1a;对比一个对象更新前后具体被修改了哪些值
Zyyyyu 的个人博客 遇到一个需求就是要记录每行数据被修改更新后#xff0c;要记录下当前值和修改前的值 那有人就会说写个if去判断值是否被修改了#xff0c;然后记录下来不就行了#xff0c;这是一个思路#x…Java对比一个对象更新前后具体被修改了哪些值
Zyyyyu 的个人博客 遇到一个需求就是要记录每行数据被修改更新后要记录下当前值和修改前的值 那有人就会说写个if去判断值是否被修改了然后记录下来不就行了这是一个思路但只适用于该类的字段少的情况而类的字段如果很多甚至几十上百个时不可能挨个去写且每次新增新的字段就需要再增加逻辑所以该思路就会被直接pass掉。
思路讲解
既然没办法通过if去判断那么还有一种办法那就是通过反射去拿到这个类中所有字段然后遍历这个类每个字段是否被修改如果修改则记录下其值和字段名下面的方法适用于所有类所以基本是copy就可以用以下为代码 /*** 获取实体类被修改的字段名** param clazz* param obj1* param obj2* return*/private static ListString getVariableNames(Class clazz, Object obj1, Object obj2) {// 存储被修改的字段名ListString modifyFields new ArrayList();try {// 解析对象1和对象2的JSONObjectJSONObject 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为nullif (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里面的值就可以了也许会有更好的办法去实现但是该方法是比较适用于我目前的项目如果有更好的的办法可以在评论区下留言互相学习。