JAVA通过反射获取实体属性变更记录⽇志信息  项⽬中某些地⽅要求记录信息变更⽇志,通过反射获取属性对⽐新旧信息的变化情况,然后记录⽇志
⼀、创建实体类⽐较标志注解(只⽐较有注解的属性)
1import java.lang.annotation.*;
2
3/**
4 * @Description //实体类⽐较标志注解
5 * @Author yangli
6 **/
7 @Documented
8 @Target(ElementType.FIELD)
9 @Retention(RetentionPolicy.RUNTIME)
10public @interface BeanContrast {
11
12    String fieldDesc() default "undefined";
13
java反射的作用及应用场景14 }
⼆、创建变更信息实体
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Description //实体修改信息类
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ModifyInfo {
@BeanContrast(fidldDesc="修改字段")
private String modifyField;
@BeanContrast(fidldDesc="修改前")
private String beforeModify;
@BeanContrast(fidldDesc="修改后")
private String afterModify;
}
三、创建⼯具类
slf4j.Slf4j;
2import org.apachemons.lang3.StringUtils;
3
4import java.beans.PropertyDescriptor;
5import flect.Field;
6import flect.Method;
7import java.util.ArrayList;
8import java.util.List;
9
10/**
11 * @Description //实体对象属性⽐较⼯具类
12 * @Author yangli
13 **/
14 @Slf4j
15public class BeanChangeUtils {
16
17/**
18    * @Description: ⽐较对象下同⼀属性的修改
19    * @param oldBean
20    * @param newBean
21    * @Return: java.util.List<entity.ModifyInfo>
22    * @Author: yangli
23    **/
24public static List<ModifyInfo> contrastObj(Object oldBean, Object newBean) {
25        List<ModifyInfo> modifyInfoList = new ArrayList<>();
26try {
27// 通过反射获取类的类类型及字段属性
28            Class clazzOld = Class();
29            Class clazzNew = Class();
30
31            Field[] fields = DeclaredFields();
32for (Field field : fields) {
33// 检查属性上有⽆⾃定义对⽐注解 -> ⽆则直接跳过
34                BeanContrast contrastAnnotation = Annotation(BeanContrast.class);
35if (contrastAnnotation == null) {
36continue;
37                }
38
39//获取字段名描述
40                String modifyField = contrastAnnotation.fieldDesc();
41
42                PropertyDescriptor pdOld = new Name(), clazzOld);
43                PropertyDescriptor pdNew = new Name(), clazzNew); 44// 获取对应属性值
45                Method getMethodOld = ReadMethod();
46                Object o1 = getMethodOld.invoke(oldBean);
47                Method getMethodNew = ReadMethod();
48                Object o2 = getMethodNew.invoke(newBean);
49if (o1 == null && o2 == null) {
50continue;
51                }
52
53if(o1 == null){
54// o2不为null的情况
55if(StringUtils.String())) {
56                        ModifyInfo modifyInfo = ModifyInfo.builder()
57                                .modifyField(modifyField)
58                                .beforeModify("")
59                                .String())
60                                .build();
61                        modifyInfoList.add(modifyInfo);
62                    }
63                } else {
64// O1不为null
65if(o2 == null ) {
66// o2为null的情况
67if (StringUtils.String())) {
68                            ModifyInfo modifyInfo = ModifyInfo.builder()
69                                    .modifyField(modifyField)
70                                    .String())
71                                    .afterModify("")
72                                    .build();
73                            modifyInfoList.add(modifyInfo);
74                        }
75                    } else {
76// o2 不为null的情况
77if ((StringUtils.String()) || StringUtils.String()))
78                                && !o1.toString().String())) {
79                            ModifyInfo modifyInfo = ModifyInfo.builder()
80                                    .modifyField(modifyField)
81                                    .String())
82                                    .String())
83                                    .build();
84                            modifyInfoList.add(modifyInfo);
85                        }
86                    }
87                }
88            }
89        } catch (Exception e) {
90            ("对⽐实体变更信息失败:", e);
91throw new Exception("系统异常");
92        }
93
94return modifyInfoList;
95    }
96
97 }
四、打完收功~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。