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

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

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);
    }
相关推荐
C4程序员23 分钟前
Java百度身份证识别接口实现【配置即用】
java·开发语言
炒空心菜菜37 分钟前
MapReduce 实现 WordCount
java·开发语言·ide·后端·spark·eclipse·mapreduce
zy happy1 小时前
搭建运行若依微服务版本ruoyi-cloud最新教程
java·spring boot·spring cloud·微服务·ruoyi
芯眼1 小时前
STM32启动文件详解(重点)
java·开发语言·c++·stm32·单片机·mybatis
想躺平的小农2 小时前
EasyExcel详解
java
慧一居士2 小时前
EasyExcel集成使用总结与完整示例
java·excel
呦呦彬2 小时前
【问题排查】easyexcel日志打印Empty row!
java·开发语言·log4j
九章云极AladdinEdu2 小时前
GPU与NPU异构计算任务划分算法研究:基于强化学习的Transformer负载均衡实践
java·开发语言·人工智能·深度学习·测试工具·负载均衡·transformer
佩奇的技术笔记2 小时前
Java学习手册:客户端负载均衡
java·负载均衡
可乐加.糖2 小时前
项目版本管理和Git分支管理方案
java·git·目标跟踪·gitlab·敏捷流程·源代码管理