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