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小时内删除。
发表评论