PRELOADER

当前文章 : 《比较Java对象中属性的不同》

10/8/2019 —— 

前言

今天同事提了一个需求让我做,大概意思在对一个用户的属性进行编辑后,在数据库中记录操作日志,主要就是记录被修改属性修改前后的值。这个问题简化一下就是判断一个类的两个对象属性值的不同。

两个对象进行比较相等,有两种做法:
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;
/*
*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;
}
}

通过类反射比较两个对象的不同

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;

/*
*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串来比较两个对象属性的不同

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;

/*
*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());
}
}