1. 程式人生 > >利用java反射完成對比日誌功能——通用實體類

利用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 -> "",這種情況
  • 好了,寫完這個工具類還是很開心的,畢竟也方便了同事的開發,好的東西要學會分享嘛。有高見的同學,可以聯絡博主,謝謝啦!