Java反射-实体属性遍历比较数据前后是否发生变动

对于数据有修改前和修改后 那么如何判断修改数据是否已发生改变而且取到修改的数据呢?-----利用反射 大大降低代码冗余度

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;
    }

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值