java利用反射记录两个相同类型对象差异以及配合swagger记录属性描述

因需要记录对应业务数据更新前后数据差异,但又不能记录所有数据,这样不好查看,需要记录又修改有差异的数据值,所以写了一个工具类,配合swagger注释来获取对象属性描述。

	/**
     * 对比数据更新前后数据存在属性差异的内容
     * @param oldObject 旧数据
     * @param newObject 新数据
     * @param <T> 返回数据对比详细
     * @return
     */
    public static <T> ChangeContentObj compareInstance(T oldObject, T newObject) {
        ChangeContentObj result = new ChangeContentObj();
        Class sourceClass = oldObject.getClass();
        List<Field> fields = new ArrayList<>();
        // 循环获取父类所有字段
        while (sourceClass != null) {
            fields.addAll(Arrays.asList(sourceClass.getDeclaredFields()));
            sourceClass = sourceClass.getSuperclass();
        }
        Map<String, String> oldMap = new HashMap<>(fields.size());
        Map<String, String> newMap = new HashMap<>(fields.size());
        for (Field field : fields) {
            try {
                // 获取swagger注释内容
                ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
                String fileName = annotation.value() + "(" + field.getName() + ")";
                field.setAccessible(true);
                if (field.get(oldObject) != null) {
                    if (!field.get(oldObject).equals(field.get(newObject))) {
                        // 记录前后属性值差异对比
                        oldMap.put(fileName, field.get(oldObject) + "");
                        newMap.put(fileName, field.get(newObject) + "");
                    }
                } else {
                    if (field.get(newObject) != null) {
                        // 记录前后属性值差异对比
                        oldMap.put(fileName, "空");
                        newMap.put(fileName, field.get(newObject) + "");
                    }
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        result.setNewContent(newMap);
        result.setOldContent(oldMap);

        return result;
    }

返回结果类

/**
 * @author Peng
 * @program springboot
 * @description
 * @create 2022/4/11 17:51
 **/
@Data
public class ChangeContentObj {

    /**
     * 旧数据内容
     */
    private Map<String, String> oldContent;

    /**
     * 新数据内容
     */
    private Map<String, String> newContent;

}

测试结果:

	public static void main(String[] args) {

        ObjectCompareObject object1 = new ObjectCompareObject();
//        object1.setUserName("张三");
        object1.setUserNumber("1001");
        object1.setUserId(1L);

        ObjectCompareObject object2 = new ObjectCompareObject();
        object2.setUserName("张三");
        object2.setUserNumber("1002");
        object2.setUserId(1L);


        ChangeContentObj changeContentObj = compareInstance(object1, object2);
        System.out.println(changeContentObj);

    }

结果:

ChangeContentObj(oldContent={用户姓名(userName)=, 用户工号(userNumber)=1001}, 
newContent={用户姓名(userName)=张三, 用户工号(userNumber)=1002})

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我想出去玩-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值