通过反射实现对象比较(实现日志功能)

在平常的项目中我们往往会因为修改功能 而要记录修改日志。
但是对同类的两个对象的修改字段进行一一比较难免过于麻烦(特别是需要对比较的字段进行改动的时候)。例如这样

    String name = fmodel.getName();
    double realNum = fmodel.getRealNum();
    String unit = fmodel.getUnit();
    String material = fmodel.getMaterial();
    String typeName = fmodel.getTypeName();
    String brand = fmodel.getBrand();

    StringBuilder sb = new StringBuilder();
    if(!name.equals(tmodel.getName())){
        sb.append("物资名称:修改前【" + tmodel.getName() + "】,修改后:【" + name + "】");
    }
    if(realNum != tmodel.getRealNum()){
        sb.append("到货量:修改前【" + tmodel.getRealNum() + "】,修改后:【" + realNum + "】");
    }
    if(!unit.equals(tmodel.getUnit())){
        sb.append("单位:修改前【" + tmodel.getUnit() + "】,修改后:【" + unit + "】");
    }
    if(!material.equals(tmodel.getMaterial())){
        sb.append("材质:修改前【" + tmodel.getMaterial() + "】,修改后:【" + material + "】");
    }
    if(!typeName.equals(tmodel.getTypeName())){
        sb.append("规格型号:修改前【" + tmodel.getTypeName() + "】,修改后:【" + typeName + "】");
    }
    if(!brand.equals(tmodel.getBrand())){
        sb.append("品牌:修改前【" + tmodel.getBrand() + "】,修改后:【" + brand + "】");
    }

我们可以通过反射 并且将字段与注释以key value 的形式存在map中进行实现

Map<String,String> map = new HashMap<String,String>();
map.put("name", "物资名称");
map.put("typeName", "规格型号");
map.put("unit", "单位");
map.put("realNum", "到货数量");
map.put("brand", "品牌");
map.put("purchaseBasicPrice", "采购基价");
map.put("purchaseDifferential", "采购级差");
map.put("purchaseFloatDown", "采购下浮");
map.put("freight", "结算运费");
map.put("purchaseTaxRate", "采购税率");
map.put("purchasePrice", "采购单价");
map.put("purchaseMoney", "采购金额");
map.put("pretaxPrice", "采购税前单价");
map.put("pretaxMoney", "采购税前金额 ");
map.put("purchaseAntiknockMarkup", "采购抗震加价 ");
map.put("purchase12mMarkup", "采购12m加价");
map.put("saleAntiknockMarkup", "销售抗震加价");
map.put("sale12mMarkup", "销售12m加价");



Class<TArrivalOrderDetail> clazz = TArrivalOrderDetail.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
    field.setAccessible(true);

    String fieldName = field.getName();
    if(map.containsKey(fieldName)){

        String val1 = judgeNotNull(field.get(newTmodel));
        String val2 = judgeNotNull(field.get(tmodel));

        if(!val2.equals(val1)){
            sb.append(map.get(fieldName)+":修改前【"+val2+"】,修改后:【"+val1+"】");
        }
    }

/**
  * 判空
  */
 private String judgeNotNull(Object obj){
         if(obj == null){
                 return "";
         }
         if(obj instanceof Double){
                 BigDecimal bigDecimal = new BigDecimal((Double)obj);
                 String result = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
                 return result;
         }
         if(obj instanceof Date){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String result = sdf.format(obj);
             return result;
     }
         return obj.toString();
 }

这样如果需要记录的字段有变化 我们只需要修改map即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值