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

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

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);
    }
相关推荐
带刺的坐椅32 分钟前
Solon AI Skills 会是 Agent 的未来吗?
java·agent·langchain4j·solon-ai
jacGJ38 分钟前
记录学习--文件读写
java·前端·学习
花间相见1 小时前
【JAVA开发】—— Nginx服务器
java·开发语言·nginx
扶苏-su1 小时前
Java---Properties 类
java·开发语言
cypking1 小时前
四、CRUD操作指南
java
2301_780669862 小时前
文件字节流输出、文件复制、关闭流的方法
java
剑锋所指,所向披靡!3 小时前
C++之类模版
java·jvm·c++
Coder_Boy_3 小时前
基于SpringAI的在线考试系统-0到1全流程研发:DDD、TDD与CICD协同实践
java·人工智能·spring boot·架构·ddd·tdd
sheji34163 小时前
【开题答辩全过程】以 面向高校校园的物物交换系统设计与实现为例,包含答辩的问题和答案
java·eclipse
卓怡学长4 小时前
m115乐购游戏商城系统
java·前端·数据库·spring boot·spring·游戏