首页
技术
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

handazao

养家糊口
首页
技术
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Docker使用

  • 数据库相关

  • Java相关

    • HashMap
    • java反射
    • 属性比对器Equator
      • 扩展使用
        • 1.自定义注解
        • 2.实体
        • 3.扩展Equator方法
        • 4.调用
  • Linux学习

  • 工具

  • vue3

  • Git

  • 技术
  • Java相关
handazao
2021-01-25
目录

属性比对器Equator

github地址 (opens new window)

一个用于比较两个对象的属性是否相等,并且可以获取所有不相等的属性的比对器

# 扩展使用

# 1.自定义注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation {

    String value() default "";

}
1
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

# 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

# 4.调用

//获取需要比较的字段名集合

List<ModifiedField> modifiedFields = CompareObject.compareObject(oldClass, newClass);
1
2
3
#Equator
上次更新: 2022/12/06, 11:10:28
java反射
Linux常用命令

← java反射 Linux常用命令→

最近更新
01
pre-push
08-07
02
commit-msg
08-07
03
pre-commit
08-07
更多文章>
Theme by Vdoing | Copyright © 2020-2024 handazao | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式