背景: 公司最近有个需求,需要比较两个对象的属性的值,把不同的值给记录起来,用来做其他的用途。
按照我之前刚毕业的想法: 这不是很简单么,直接用equals进行比较不了就行了么??
//最惨的方法,按个比较
private static void fieldCompare2(Persion beforeObj ,Persion afterObj) throws Exception{
if (beforeObj.getName().equals(afterObj.getName())){
//巴拉巴拉 一顿操作
}
}
如大家所见,这种是最SB的方法。如果字段很多,那你if不是无限多
为此我们应该用使用field对象来处理
核心处理逻辑代码:
//使用field对象来处理
private static void fieldCompare(Object beforeObj ,Object afterObj) throws Exception{
Field[] beforeFields = beforeObj.getClass().getDeclaredFields();
Field[] afterFields = afterObj.getClass().getDeclaredFields();
Field.setAccessible(beforeFields, true); //设置私有属性可以访问到
Field.setAccessible(afterFields, true);
//循环遍历比较属性
if(beforeFields != null && beforeFields.length > 0){
for(int i=0; i<beforeFields.length; i++){
Object beforeValue = beforeFields[i].get(beforeObj); //取出对应的属性值
Object afterValue = afterFields[i].get(afterObj);
StringBuffer differentBuf=new StringBuffer();
if((beforeValue != null && !"".equals(beforeValue) && !beforeValue.equals(afterValue)) || ((beforeValue == null || "".equals(beforeValue)) && afterValue != null)){
differentBuf.append("字段:").append( beforeFields[i].getName())
.append("原值为:").append(beforeValue)
.append("现值为:").append(afterValue);
System.out.println(differentBuf.toString());
}
}
}
}
对象以及测试方法
static class Persion{
private String id;
private String name;
private int age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public static void main(String[] args) throws Exception {
Persion p1=new Persion();
p1.setId("1");
p1.setAge(24);
p1.setName("张三");
Persion p2=new Persion();
p2.setId("2");
p2.setAge(26);
p2.setName("李四");
fieldCompare(p1,p2);
}
效果展示:
记录每一个成长点点滴滴