利用java反射完成對比日誌功能 一
阿新 • • 發佈:2019-01-06
一 需求
舉例:對商品進行編輯,並記錄差異日誌。相信這在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:
- oldPro
- newPro
- 用list儲存不需要對比的欄位
return:
- StringBuffer