利用java反射完成对比日志功能——通用实体类

一 需求

通用实体类字段的对比来生成日志

/**
     * 对象编辑:生成字段差异信息
     * @param oldObj 编辑前对象
     * @param newObj 编辑后对象
     * @param objMap 编辑对象所有字段
     * @param unCompare 不需要比对的字段
     * @param enumFiled 需要用到枚举的字段
     * @param hyperlink 需要设置成超链接的字段
     * @author qianyongchao
     * @date 2018/11/09
     */
    public static StringBuffer createFiledsDiffrents(Object oldObj, Object newObj, Map<String, String> objMap, List<String>
            unCompare, List<String> enumFiled, List<String> hyperlink) {
        StringBuffer buffer = new StringBuffer();
        Field[] fields = oldObj.getClass().getDeclaredFields();
        Field[] fields1 = oldObj.getClass().getDeclaredFields();
        Field[] fields2 = newObj.getClass().getDeclaredFields();
        for (int m = 0; m < fields.length; m++) {
            Field f1 = fields1[m];
            Field f2 = fields2[m];
            f1.setAccessible(true); // 设置些属性是可以访问的
            f2.setAccessible(true); // 设置些属性是可以访问的
            try {
                //字段对应值
                Object val1 = new Object();
                Object val2 = new Object();
                val1 = f1.get(oldObj);
                val2 = f2.get(newObj);

                //排除字段的比较
                if(unCompare.contains(f1.getName())) {
                    continue;
                }

                if (val1 == null) {

                    //如果都为空 不计入日志
                    if ("".equals(val2) || val2 == null) {
                        continue;
                    }
                    // 将图片 设置成超链接
                    if(hyperlink != null && hyperlink.size() > 0) {
                            if(hyperlink.contains(f1.getName())) {
                                String resultText1 = "<a href=\"" + val1 + "\">" + val1 + "</a>";
                                String resultText2 = "<a href=\"" + val2 + "\">" + val2 + "</a>";
                                buffer.append(objMap.get(f1.getName()) + " : " + resultText1 + " -> " + resultText2 + "; ");
                                continue;
                            }
                    }

                    buffer.append(objMap.get(f1.getName()) + " : " + val1 + " -> " + val2 + "; ");
                } else if (val1.equals(val2) == false) {
                    if(enumFiled.contains(f1.getName())) {
                        if ("status".equals(f1.getName())) {
                            buffer.append(objMap.get(f1.getName()) + " : " + StatusEnum.fromCode(val1.toString()).getMsg() + " -> " + StatusEnum
                                    .fromCode(val2.toString()).getMsg() + "; ");
                            continue;
                        }

                        buffer.append(objMap.get(f1.getName()) + " : " + DefaultBooleanStatus.fromCode(val1.toString()).getMsg() + " -> " + DefaultBooleanStatus
                                .fromCode(val2.toString()).getMsg() + "; ");
                        continue;
                    }

                    //设置成超链接
                    if(hyperlink != null && hyperlink.size() > 0) {
                        if(hyperlink.contains(f1.getName())) {
                            String resultText1 = "<a href=\"" + val1 + "\">" + val1 + "</a>";
                            String resultText2 = "<a href=\"" + val2 + "\">" + val2 + "</a>";
                            buffer.append(objMap.get(f1.getName()) + " : " + resultText1 + " -> " + resultText2 + "; ");
                            continue;
                        }
                    }

                    buffer.append(objMap.get(f1.getName()) + " : " + val1 + " -> " + val2 + "; ");
                }
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return buffer;
    }

 

 

二 注意

  • 需要的参数都已经清楚了,额外要注意的是,后台要生成一个map,filed -> 实际意义,不然日志中,都是某某字段: xxx -> xxx
  • 如果有图片更改,这里将图片地址设置成了超链接,后台日志中可以直接点击查看图片,所以说很方便!
  • 日志中,可能会出现  null -> "",这种情况
  • 好了,写完这个工具类还是很开心的,毕竟也方便了同事的开发,好的东西要学会分享嘛。有高见的同学,可以联系博主,谢谢啦!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值