利用java反射完成對比日誌功能——通用實體類
阿新 • • 發佈:2019-01-06
一 需求
通用實體類欄位的對比來生成日誌
/** * 物件編輯:生成欄位差異資訊 * @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 -> "",這種情況
- 好了,寫完這個工具類還是很開心的,畢竟也方便了同事的開發,好的東西要學會分享嘛。有高見的同學,可以聯絡博主,謝謝啦!