前言
今天同事提了一个需求让我做,大概意思在对一个用户的属性进行编辑后,在数据库中记录操作日志,主要就是记录被修改属性修改前后的值。这个问题简化一下就是判断一个类的两个对象属性值的不同。
两个对象进行比较相等,有两种做法:
1,情况一:当仅仅只是判断两个对象是否相等时,只需重写equals()方法即可。
2.情况二:当除了情况一之外,还需知道是那个属性不同,那么就需要采用类反射。也可以先把对象转成Json串,再依次进行比较。
为了后面的举例,我们先新建一个简单的类Student:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package test;
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; } }
|
通过类反射比较两个对象的不同
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| package test;
import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map;
import net.sf.json.JSONObject;
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) { 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串来比较两个对象属性的不同
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| package test;
import java.util.HashMap; import java.util.Map;
import net.sf.json.JSONObject;
public class test2 {
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); 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()); } }
|