利用java反射完成对比日志功能 一

一  需求

举例:对商品进行编辑,并记录差异日志。相信这在javaWeb中是个很常见对功能,常见的做法就是一个个比较,很麻烦,实体类可能有十几二十几个字段,还要排除NullPointException的情况(非必填项),用反射的方法可以避免这些零碎的判断!直接上代码!

      //日志 部分
        Map<String, String> proMap = getPromap();
        Product product = new Product();
        product.setId("1");
        product.setAge(2);
        product.setLastName("fdaf");

        //product1 编辑前对象 根据id查
        //product2 当前保存的对象
        Field[] fields = new Product().getClass().getFields();
        Field[] fields1 = product1.getClass().getFields();
        Field[] fields2 = product2.getClass().getFields();

        Object val1 = null;
        Object val2 = null;

        StringBuffer buffer = new StringBuffer();

        for(int i = 0;i<fields.length;i++) {
            //val1 = new Object();
            fields1[i].setAccessible(true);
            fields2[i].setAccessible(true);

            val1 = fields1[i].get(product1);
            val2 = fields2[i].get(product2);

            //不需要比较的字段,比如id,updated。没有意义的字段。
            Boolean idBool = "id".equals(fields[i]);
            Boolean createdBool = "created".equals(fields[i]);

            //注意 equals()用法:常量 放在前面
            if(val1 == null) {
                if(!idBool && !createdBool) {
                    buffer.append(proMap.get(fields1[i]) + ":" + fields1[i].get(product1) + " -> " + fields2.get(product2));
                }

            } else if()(val1.equals(val2) == false) {
                if(!idBool && !createdBool) {
                    buffer.append(proMap.get(fields2[i]) + ":" + fields1[i].get(product2) + " -> " + fields2.get(product2));
                }
            }
        }
    }

    
    //这块比较麻烦,要将所有要对比的字段信息全部放到map中,不然,打印出来的日志,用户只能看到字段属性
    public Map<String, String> getPromap() {
        Map<String, String> map = new HashMap<>();
        map.put("name","商品名称");
        map.put("sale_price","商品售价");
        return map;
    }

二 总结 

其实可以封装一个工具

public StringBuffer getLog(pro1, pro2 ,fieldList);

param:

  1. oldPro
  2. newPro 
  3. 用list保存不需要对比的字段

return:

  • StringBuffer

猜你喜欢

转载自blog.csdn.net/u014425865/article/details/83513452