通过反射机制,比较两个对象的字段值的差异

开发需求中会存在比较前端传来的数据与后台数据有哪些数据发生了改变,一个一个字段比较太麻烦了,通过以下方法可以便捷的比较出来

java 复制代码
//实现方法
 private static List<ChangeContentDTO> getDifferentField(Object obj, Object afterObj) {
        try {
            //首先,创建一个空的列表用于存储变化的内容。
            List<ChangeContentDTO> changeContentDTOList = new ArrayList<>();
            //检查传入的两个对象是否为空,如果任何一个对象为空,则直接返回空列表。
            if (Objects.isNull(obj) || Objects.isNull(afterObj)) {
                return changeContentDTOList ;
            }
            // 获取对象的 Class 对象,然后获取这个 Class 对象的所有字段。
            Class<?> clazz = obj.getClass();
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                // 遍历这些字段,对于每一个字段,首先设置它可以被访问(因为默认情况下,Java 的私有字段是不能被直接访问的)。
                field.setAccessible(true);
                if (Objects.isNull(field.get(obj))) {
                    continue;
                }
                DefinedAnnotation annotation= field.getDeclaredAnnotation(DefinedAnnotation.class);
                //检查字段的值是否为空,如果为空,则跳过这个字段。
                if (Objects.nonNull(annotation)&&!Objects.equals(field.get(obj), field.get(afterObj))) {
                    //获取字段的注解,如果字段有定义的注解,并且字段的值在两个对象中不同,则创建一个 DTO 对象,将字段的名称、注解的名称、变化前的值和变化后的值存入 DTO 对象,然后将这个 DTO 对象添加到列表中。
                    ChangeContentDTO dto = ChangeContentDTO.builder()
                            .fieldCode(field.getName())
                            .fieldName(annotation.name())
                            .changeBefore(field.get(obj))
                            .changeAfter(field.get(afterObj)).build();
                    changeContentDTOList.add(dto);
                }
            }
            return changeContentDTOList;
        } catch (IllegalAccessException e) {
            throw new BusinessException(BasicErrorCode.BIZ_ERROR, "通过反射获取对象字段的值失败");
        }

    }
java 复制代码
//创建bean对象存储变化的数据
@ApiModel("变更内容DTO")
@Getter
@Setter
@Builder
public class ChangeContentDTO {

    @ApiModelProperty("字段名称")
    private String fieldCode;

    @ApiModelProperty("字段名称")
    private String fieldName;

    @ApiModelProperty("变更前的内容")
    private Object changeBefore;

    @ApiModelProperty("变更后的内容")
    private Object changeAfter;

}
java 复制代码
//main方法测试
 public static void main(String[] args) {
        ResourceEntity resourceEntity = new ResourceEntity();
        ResourceEntity resourceEntity1 = new ResourceEntity();
        resourceEntity.setCode("111");
        resourceEntity1.setCode("222");
        resourceEntity.setName("name");
        resourceEntity1.seName("name");
        List<ChangeContentDTO> list = getDifferentField(resourceEntity, resourceEntity1);
        System.out.println(list);
    }
相关推荐
情缘晓梦.10 分钟前
C语言指针进阶
java·开发语言·算法
南知意-2 小时前
IDEA 2025.3 版本安装指南(完整图文教程)
java·intellij-idea·开发工具·idea安装
码农水水2 小时前
蚂蚁Java面试被问:混沌工程在分布式系统中的应用
java·linux·开发语言·面试·职场和发展·php
海边的Kurisu2 小时前
苍穹外卖日记 | Day4 套餐模块
java·苍穹外卖
毕设源码-邱学长3 小时前
【开题答辩全过程】以 走失儿童寻找平台为例,包含答辩的问题和答案
java
他们叫我技术总监3 小时前
Python 列表、集合、字典核心区别
android·java·python
江沉晚呤时3 小时前
从零实现 C# 插件系统:轻松扩展应用功能
java·开发语言·microsoft·c#
梁下轻语的秋缘3 小时前
ESP32-WROOM-32E存储全解析:RAM/Flash/SD卡读写与速度对比
java·后端·spring
wanzhong23334 小时前
开发日记8-优化接口使其更规范
java·后端·springboot
Knight_AL4 小时前
Java 多态详解:概念、实现机制与实践应用
java·开发语言