获取java对象被更新的属性和值

news2024/11/25 10:27:51

业务场景

更新User信息后,需要收集哪些字段的哪些值被更新了。

在这里插入图片描述

思路

比较originUsernewUser,收集值不同的属性以及变化前后的值。

在这里插入图片描述

代码实现

public static Map<String, Map<String, Object>> getChange(Object originObject, Object newObject) {
        // 存在为null比价就没意义了
        if (ObjectUtils.anyNull(originObject, newObject)) {
            return new HashMap<>();
        }

        // 不同类型无法比较
        if (ObjectUtils.notEqual(originObject.getClass(), newObject.getClass())) {
            return new HashMap<>();
        }

        // 内容都相等所以没必要比较
        if (Objects.deepEquals(originObject, newObject)) {
            return new HashMap<>();
        }

        Map<String, Map<String, Object>> res = Maps.newHashMap();

        Field[] declaredFields = originObject.getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            // 检查Field是否为合成字段、如果该字段是合成字段则不进行比较
            if (field.isSynthetic()) {
                continue;
            }

            // serialVersionUID适用于java序列化机制,非业务属性
            if ("serialVersionUID".equals(field.getName())) {
                continue;
            }

            // 实现方式1
            // field.setAccessible(true);
            // Object o = field.get(originObject);
            // Object n = field.get(originObject);

            // 实现方式2
            PropertyDescriptor propertyDescriptor = null;
            try {
                propertyDescriptor = new PropertyDescriptor(field.getName(), originObject.getClass());
                Method readMethod = propertyDescriptor.getReadMethod();
                Object originValue = readMethod.invoke(originObject);
                Object newValue = readMethod.invoke(newObject);
                if (!Objects.deepEquals(originValue, newValue)) {
                    // 值不相等的话记录属性和值
                    HashMap<String, Object> keyValue = new HashMap();
                    keyValue.put("origin", originValue);
                    keyValue.put("new", newValue);
                    res.put(field.getName(), keyValue);
                }
            } catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) {
                log.error("getChange occur error" + e.getMessage());
            }

        }
        return res;
    }

在这里插入图片描述

测试验证

public class MethodUtilsTest {

    @Test
    public void getChangeNoChange() {
        User user1 = new User();
        user1.setName("user2");
        user1.setAge("19");
        user1.setNum("123456");

        User user2 = new User();
        user2.setName("user2");
        user2.setAge("19");
        user2.setNum("123456");

        Map<String, Map<String, Object>> change = MethodUtils.getChange(user1, user2);
        Assert.assertEquals("{}", change.toString());

    }

    @Test
    public void getChangeWithChange() {
        User user1 = new User();
        user1.setName("user1");
        user1.setAge("19");
        user1.setNum("123456");

        User user2 = new User();
        user2.setName("user2");
        user2.setAge("18");
        user2.setNum("123457");

        Map<String, Map<String, Object>> change = MethodUtils.getChange(user1, user2);
        Assert.assertEquals("{num={new=123457, origin=123456}, name={new=user2, origin=user1}, age={new=18, origin=19}}", change.toString());
    }

    @Data
    static class User {
        private String name;
        private String age;
        private String num;
    }
}

在这里插入图片描述

参考

对象被更新后、获取更新了的属性和值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/721183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 9 - 模块化系统

定义要导出的模块 package com.lfsun.java9study.mypackage;public class MyClass {public static void sayHello() {System.out.println("Hello from com.lfsun.java9study.mypackage!");}public static void main(String[] args) {System.out.println("test&…

【Linux】LVS负载均衡群集 DR模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 LVS负载均衡群集 DR模式 数据包流向分析DR 模式的特点LVS-DR中的ARP问题VIP地址相同导致响应冲突返回报文时源地址使用VIP&#xff0c;导致网关设备的ARP缓存表紊乱 DR模式 L…

Pycharm配置解释器(interpreter)

关于pycharm编译器的解释器&#xff0c;网友朋友的分享 Pycharm配置&#xff08;1&#xff09;——解释器&#xff08;interpreter&#xff09; 详细了解PyCharm支持的4种Python Interpreter和配置方法 对大多数人而言就只需要 分清虚拟解释器和系统解释器&#xff0c;使用虚拟…

关闭Win10的预览窗口

关闭Win10的预览窗口 每次拖拽文件都显示那个黑边的模型一样的东西&#xff0c;通过上面可以关闭该功能。

MBD开发 STM32 外部仿真

要接一个串口&#xff0c;用来设备和simulink的通信 烧录即可 烧录时选择串口

.360勒索病毒的加密数据怎么处理?|.360勒索病毒数据解密恢复

.360勒索病毒是一种恶意软件&#xff0c;它对用户的计算机文件进行加密&#xff0c;并要求支付赎金才能解密恢复数据。这种勒索病毒以其广泛传播和严重破坏性而闻名&#xff0c;给个人用户和企业带来了巨大的困扰和损失。 一家中型制造企业&#xff0c;名为XYZ制造有限公司&…

用科技智造新未来!在线开发平台强力助推数字化发展

在科技智造新时代&#xff0c;科技的力量是无处不见的。运用科技可以创造美好的生活&#xff0c;可以实现数字化发展&#xff0c;帮助企业实现流程化管理。在线开发平台将科技元素注入到平台中&#xff0c;将科技与办公需求相连接&#xff0c;创造高效率办公及流程化发展。 1…

# hub.docker.com镜像加速站点仓库的搭建与使用

hub.docker.com镜像加速站点仓库的搭建与使用 文章目录 hub.docker.com镜像加速站点仓库的搭建与使用1 镜像仓库搭建1.1 创建目录及docker-compose.yaml1.2 如果要开启密码验证&#xff0c;需要先生成密码1.3 启动服务 2 用户端使用3 最后 前段时间由于拉取docker镜像&#xff…

初出茅庐的小李博客之链表知识2

链表知识点2 通过malloc函数动态创建节点&#xff1a; #include <stdio.h> #include <stdlib.h>typedef struct List Node_t;struct List {/*数据区域有两个变量*/int a;float b;/*地址区域有一个指针*/Node_t* pNext; };Node_t Head_Node; //表头变量 Node_t Bo…

ChatGPT与Excel结合_编写VBA宏

先来解释下什么是Excel vba宏 ⭐Excel VBA宏&#xff08;Visual Basic for Applications&#xff09;是一种用于在Microsoft Excel中自动化和扩展功能的编程语言。VBA允许用户编写自定义的脚本或宏&#xff0c;以便通过执行一系列指令来自动完成特定任务。 使用Excel VBA宏&a…

分布式——监控平台zabbix的认识与搭建

作为一个运维&#xff0c;需要会使用监控系统查看服务器系统性能、应用服务状态和网站流量指标等&#xff0c;利用监控系统的数据去了解网站上线发布的结果和健康状态。 利用一个优秀的监控软件&#xff0c;我们可以: ●通过一个友好的界面进行浏览整个网站所有的服务器状态 ●…

自学软件测试

自学软件测试体系&#xff08;1&#xff09; 前言&#xff1a;很多小伙伴想要自学软件测试课程走上测试工程师道路&#xff0c;基于此目的给出想要自学软件测试的一些小伙伴一些学习的方向。软件测试工程师的职业发展方向包括功能测试&#xff0c;自动化测试&#xff0c;专项测…

【Ubuntu学习MySQL——报错 ERROR 2002 (HY000)】

问题&#xff1a; 报错含义&#xff1a; 根据上面的报错&#xff0c;意思是说mysql想使用/var/run/mysqld/mysqld.scok文件&#xff0c;但是无法连接&#xff0c;接下来我们来看看这个文件是否存在 1.查看所有的sock文件 sudo find / -type s 根据上述命令所得出的结果可以知…

【REST规范】JAX-RS有哪些实现

JAX-RS是JAVA EE6 引入的一个新技术。 JAX-RS即Java API for RESTful Web Services&#xff0c;是一个Java 编程语言的应用程序接口&#xff0c;支持按照表述性状态转移&#xff08;REST&#xff09;架构风格创建Web服务。JAX-RS使用了Java SE5引入的Java注解来简化Web服务的客…

electron应用重启,开机自启动(electron开发常用的方法、优化方案)

文章目录 electron应用重启electron开机自启动To run a local app, execute the following on the command line: electron应用重启 获取应用软件的安装路径electron中屏幕全屏&#xff0c;最大化&#xff0c;最小化&#xff0c;恢复electron启动白屏时间过长优化方案1. 按需加…

web测试需要注意几个非常重要的测试点

微软语言标准&#xff1a; 全角字符和半角字符都要使用一个空格分开 英文和数字直接要有空页面分辨率&#xff1a; 通常是计算机的默认分辨率&#xff0c;但是还是会有一些老式电脑存在1024*768的情况 浏览器的兼容性&#xff1a; 目前市场上的主流浏览器&#xff1a;IE8.0-…

Kubernetes入门实战课-k8s的基本架构

Kubernetes入门实战课-k8s的基本架构 文章目录 Kubernetes入门实战课-k8s的基本架构Kubernetes 的基本架构标准工作语言 YAML学习经验总结 Kubernetes 的基本架构 Kubernetes 扮演的角色就如同一个“大师级别”的系统管理员&#xff0c;具有丰富的集群运维经验&#xff0c;独创…

Java多线程基础-10:代码案例之定时器

定时器就是一个闹钟。它可以设定一个时间&#xff0c;当时间到&#xff0c;就可以执行某个指定的代码。 定时器是实际开发中的一种非常常用的组件。比如网络通信中&#xff0c;如果对方 500ms 内没有返回数据&#xff0c;则要求断开连接尝试重连&#xff1b;又比如一个 Map&…

华为OD机试真题 Python 实现【网上商城优惠活动(一)】【2022 Q4 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、补充说明五、Python算法源码六、效果展示1、输入2、输出3、说明 一、题目描述 某网上商城举办优惠活动&#xff0c;发布了满减、打折、无门槛3种优惠券&#xff0c;分别为&#xff1a; 1.每满100元优惠10元&#xff0c;无使用数…

测试开发 —— 快速定位问题

写在前面 这两天工作实在是有点小忙&#xff0c;感觉好久没更新了&#xff0c;但是平时也是有感而发的比较多&#xff0c;今天遇到一个问题&#xff0c;感觉挺有意思&#xff0c;处理过程也非常有意义&#xff0c;希望能给大家一个借鉴吧。 测试平台又又又出问题了 今天一位…