比较Java对象中属性的不同
前言
今天同事提了一个需求让我做,大概意思在对一个用户的属性进行编辑后,在数据库中记录操作日志,主要就是记录被修改属性修改前后的值。这个问题简化一下就是判断一个类的两个对象属性值的不同。
两个对象进行比较相等,有两种做法:
1,情况一:当仅仅只是判断两个对象是否相等时,只需重写equals()方法即可。
2.情况二:当除了情况一之外,还需知道是那个属性不同,那么就需要采用类反射。也可以先把对象转成Json串,再依次进行比较。
为了后面的举例,我们先新建一个简单的类Student:
package test; /* *author:Marin *time: */ public class Student { private String stuid; private String stduname; private Integer age; public String getStuid() { return stuid; } public void setStuid(String stuid) { this.stuid = stuid; } public String getStduname() { return stduname; } public void setStduname(String stduname) { this.stduname = stduname; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
通过类反射比较两个对象的不同
package test; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; import net.sf.json.JSONObject; /* *author:Marin *time: */ public class test1 { public static void main(String[] args) { Student student1=new Student(); student1.setStuid("08163312"); student1.setStduname("小马"); student1.setAge(21); Student student2=new Student(); student2.setStuid("08163311"); student2.setStduname("小马"); student2.setAge(19); Map<String, String> orgobj = new HashMap<String, String>(); Map<String, String> nowobj = new HashMap<String, String>(); Field[] fs = student1.getClass().getDeclaredFields(); for (Field f : fs) { f.setAccessible(true); Object v1 = null; Object v2 = null; try { v1 = f.get(student1); v2 = f.get(student2); } catch (IllegalArgumentException | IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (!equals(v1, v2)) { orgobj.put(f.getName(), v1.toString()); nowobj.put(f.getName(), v2.toString()); } } System.err.println(orgobj.toString()); System.err.println(nowobj.toString()); } public static boolean equals(Object obj1, Object obj2) { if (obj1 == obj2) { return true; } if (obj1 == null || obj2 == null) { return false; } return obj1.equals(obj2); } }
通过JSON串来比较两个对象属性的不同
package test; import java.util.HashMap; import java.util.Map; import net.sf.json.JSONObject; /* *author:Marin *time: */ public class test2 { public static void main(String[] args) { // TODO Auto-generated method stub Student student1=new Student(); student1.setStuid("08163312"); student1.setStduname("小马"); student1.setAge(21); Student student2=new Student(); student2.setStuid("08163311"); student2.setStduname("小马"); student2.setAge(19); JSONObject obj1 = JSONObject.fromObject(student1); JSONObject obj2 = JSONObject.fromObject(student2); Map orgobj = new HashMap(); Map nowobj = new HashMap(); for(int i=0;i<obj1.names().size();i++){ if(!isTheSame(obj1, obj2, i)){ orgobj.put(obj1.names().get(i), obj1.get(obj1.names().get(i).toString())); nowobj.put(obj2.names().get(i), obj2.get(obj2.names().get(i).toString())); } } System.err.println(orgobj.toString()); System.err.println(nowobj.toString()); } private static boolean isTheSame(JSONObject obj1, JSONObject obj2, int i) { return obj1.get(obj1.names().get(i)).equals(obj2.get(obj1.names().get(i)).toString()); } }