首页 > 其他分享 >SpringBoot通过自定义注解+反射机制比较两个对象不同的属性值

SpringBoot通过自定义注解+反射机制比较两个对象不同的属性值

时间:2023-11-06 11:06:43浏览次数:32  
标签:old SpringBoot 自定义 field param source formatDate 注解 objAfter

public class FieldComparisonUtil {
/**
• 直接返回一个新的对象,并且对象的值 只有被修改的部分
• 
• @param old
• @param source
• @param isParent
• @param target   目标对象
• @return
/**
• @param old      进行属性比较的原始数据
• @param source   进行属性比较的新数据
• @param isParent 是否存在父类
• @return
*/
public static Map compareFields(Object old, Object source, Boolean isParent) {
Map map = new HashMap<>(8);
try {
// 只有两个对象都是同一类型的才有可比性
if (old.getClass() == source.getClass()) {
List fieldList = new ArrayList<>();
     Class<?> clazz = old.getClass();
     // 获取字段
     Field[] fields = clazz.getDeclaredFields();
     fieldList.addAll(Arrays.asList(fields));
     // 获取父类字段
     if (isParent) {
         Class<?> superclass = clazz.getSuperclass();
         Field[] parentFields = superclass.getDeclaredFields();
         fieldList.addAll(Arrays.asList(parentFields));
     }

     // 这里就是所有的属性了
     for (Field field : fieldList) {
         boolean annotationPresent = field.isAnnotationPresent(FieldComparison.class);
         // 没有注解的字段表示,不参与比较
         if (!annotationPresent) {
             continue;
         }

         field.setAccessible(true);
         // 属性名
         String fieldName = field.getName();

         // 在old上调用get方法等同于获得old的属性值
         Object objBefore = field.get(old);
         // 在source上调用get方法等同于获得source的属性值
         Object objAfter = field.get(source);

         // 比较字段同时为空时,则表示是一样的值
         if (objAfter instanceof String) {
             if (StringUtils.isEmpty(objBefore) && StringUtils.isEmpty(objAfter)) {
                 continue;
             }
         }

         // 比较是否一致
         boolean equals = Objects.equals(objBefore, objAfter);
         // 不一致则进行记录
         if (!equals) {
             if (objAfter != null) {
                 /**
                  * 如果要使用字符串记录,那么对特殊的数据,需要进行转换
                  if (objAfter instanceof Date) {
                  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                  String formatDate = sdf.format((Date) objAfter);
                  map.put(fieldName, formatDate);
                  } else if (objAfter instanceof LocalDateTime) {
                  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                  String formatDate = ((LocalDateTime) objAfter).format(formatter);
                  map.put(fieldName, formatDate);
                  } else if (objAfter instanceof LocalDate) {
                  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                  String formatDate = ((LocalDate) objAfter).format(formatter);
                  map.put(fieldName, formatDate);
                  }
                  **/
                 map.put(fieldName, objAfter);
             }
         }
     }
 }

} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
return map;
}

标签:old,SpringBoot,自定义,field,param,source,formatDate,注解,objAfter
From: https://blog.51cto.com/u_16265692/8202171

相关文章

  • Java 获取自定义注解 字段值 及 注解值
    自定义注解packagecom.jianmu.bean.annotation;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/**[email protected]......
  • 038-第三代软件开发-简易视频播放器-自定义Slider (二)
    第三代软件开发-简易视频播放器-自定义Slider(二)文章目录第三代软件开发-简易视频播放器-自定义Slider(二)项目介绍简易视频播放器自定义Slider(二)横向纵向关键字:Qt、Qml、关键字3、关键字4、关键字5项目介绍欢迎来到我们的QML&C++项目!这个项目结合了QML(QtMeta-......
  • 034-第三代软件开发-自定义Slider(一)
    第三代软件开发-自定义Slider(一)文章目录第三代软件开发-自定义Slider(一)项目介绍自定义Slider(一)总结一下关键字:Qt、Qml、Slider、position、关键字5项目介绍欢迎来到我们的QML&C++项目!这个项目结合了QML(QtMeta-ObjectLanguage)和C++的强大功能,旨在开发出色的......
  • Linux脚本:批量启动docker容器、批量启动springboot、批量启动Vuejs
    批量启动springboot#!/bin/bash#检查容器是否已经启动check_container(){sudodockerps|grep"$1">/dev/nullif[$?-ne0];thenecho"$1containerisnotrunning.Starting$1..."sudodockerstart"$1"elseecho......
  • springboot第44集:Kafka集群和Lua脚本
    servers:Kafka服务器的地址。这是Kafka集群的地址,生产者将使用它来发送消息。retries:在消息发送失败时,生产者将尝试重新发送消息的次数。这个属性指定了重试次数。batchSize:指定了生产者在发送消息之前累积的消息大小(以字节为单位)。一次性发送多个消息可以提高性能。linger:指定了生......
  • Spring自定义数据校验并实现国际化功能
    通常,当我们需要验证用户输入时,SpringMVC提供标准的预定义验证器。我们会引入spring-boot-starter-validation依赖来实现数据校验功能。但是,当我们需要验证特定类型的输入时,我们就需要创建自己的自定义校验逻辑。这里我们取一个相对简单的校验手机号码的功能来实现。为了校验手......
  • springboot入门
    两年没写了。。连右下的小人都没了。得开始新一阶段的学习了。先从学习springboot及其前置内容开始学习。然后简单复习一下vue框架。idea在创建maven的springboot工程时自动下了个依赖,尽量选择版本低一点的。。适配java8不容易出问题。一旦出问题了多重建项目就会重新下springboo......
  • 苹果iOS 17.2年底推送:iPhone 15 Pro的自定义操作按钮功能升级
    据报道,苹果会在年底推送iOS17.2版本,新版系统将会修复iPhone15系列WiFi速度慢的问题。与此同时,iOS17.2将会带来翻译功能,iPhone15Pro的自定义操作按钮切换到翻译选项后,按住会弹出一个翻译窗口,用于翻译设备听到的语音内容。除此之外,这枚自定义操作按钮还可以设置为其它很多功......
  • SpringBoot 基础知识
    ​#SpringBoot#​‍本文基于SpringBoot2.0最新稳定版2.7.6;目前SpringBoot3.0已经发布,后续会体验新版新特性。官网:SpringBoot‍SpringBoot程序的优点起步依赖(简化依赖配置)自动配置(简化常用工程相关配置)辅助功能(内置服务器,.....)快速上手SpringBoot工程联网......
  • SpringBoot图书管理系统运行教程
    @文章目录目录1、前期必备1.1、所需软件版本说明1.2、下载源码1.3、下载开发工具1.4、下载JDK并配置环境变量1.5、安装数据库和数据库管理工具1.6、安装配置Maven2、将SQL文件导入到数据库2.1、新建MySQL连接2.2、新建数据库并导入SQL3、IDEA配置Maven环境4、IDEA安装Lombok插件5......