1. 程式人生 > >利用java反射完成對比日誌功能 一

利用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