属性比对器Equator
一个用于比较两个对象的属性是否相等,并且可以获取所有不相等的属性的比对器
# 扩展使用
# 1.自定义注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation {
String value() default "";
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 2.实体
@Getter
@Setter
@ToString
public class ModifiedField {
/**
* 被修改的字段名
*/
private String fieldName;
/**
* 被修改的旧值
*/
private Object oldValue;
/**
* 被修改的新值
*/
private Object newValue;
/**
* 被修改的字段名中文解释
*/
private String remark;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 3.扩展Equator方法
public class CompareObject {
/**
* 比较并返回被修改过的对象属性 ModifiedField
*
* @param modifyObject: 新值对象
* @param oldObject: 旧值对象
* @return
*/
public static List<ModifiedField> compareObject(Object modifyObject, Object oldObject) {
//创建结果对象
List<ModifiedField> result = new ArrayList<>();
//获取对比字段
List<String> importFieldName = getImportFieldName(modifyObject);
FieldBaseEquator fieldBaseEquator = new FieldBaseEquator(importFieldName, null);
//对比,返回属性值不同字段
List<FieldInfo> diffFields = fieldBaseEquator.getDiffFields(modifyObject, oldObject);
//封装成我们需要的对象
for (FieldInfo diffField : diffFields) {
ModifiedField modifiedField = new ModifiedField();
modifiedField.setFieldName(diffField.getFieldName());
modifiedField.setNewValue(diffField.getFirstVal());
modifiedField.setOldValue(diffField.getSecondVal());
//获取字段注解中文释义
String remark = getRemarkByFieldName(modifyObject, diffField.getFieldName());
modifiedField.setRemark(remark);
result.add(modifiedField);
}
return result;
}
/**
* 根据传入的对象,和字段名,获取对应注解的中文名称
*
* @param obj
* @param fieldName
* @return
*/
private static String getRemarkByFieldName(Object obj, String fieldName) {
Class<?> aClass = obj.getClass();
try {
Field field = aClass.getDeclaredField(fieldName);
if (field.isAnnotationPresent(Annotation.class)) {
Annotation annotation = field.getAnnotation(Annotation.class);
return annotation.value();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取对象注解注释过的属性名集合
*
* @param obj
* @return
*/
private static List<String> getImportFieldName(Object obj) {
//创建集合对象,保存是否是重要字段名
List<String> importFieldName = new ArrayList<>();
//获取类加载器对象
Class aClass = obj.getClass();
//获取所有的字段
Field[] declaredFields = aClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
if (declaredField.isAnnotationPresent(Annotation.class)) {
//保存
importFieldName.add(declaredField.getName());
}
}
return importFieldName;
}
}
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# 4.调用
//获取需要比较的字段名集合
List<ModifiedField> modifiedFields = CompareObject.compareObject(oldClass, newClass);
1
2
3
2
3
上次更新: 2022/12/06, 11:10:28