一 需求
举例:对商品进行编辑,并记录差异日志。相信这在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