首页 > 编程语言 >使用反射完成 Spring Boot 程序对象操作记录

使用反射完成 Spring Boot 程序对象操作记录

时间:2024-11-11 19:46:21浏览次数:3  
标签:反射 记录 对象 Spring Boot field 操作 append

使用反射完成 Spring Boot 程序对象操作记录


1. 引言

1.1 背景和目的

在开发业务系统时,常需要记录方法调用和对象操作的日志,例如记录谁在什么时候对哪些对象进行了什么操作。这种功能在审计、调试和系统回溯中非常重要。然而,为了避免重复性代码,可以利用反射实现对象操作记录,既通用又灵活。

1.2 为什么选择反射

  • 动态性:反射可以在运行时操作类和对象的信息,适应复杂多变的业务需求。
  • 灵活性:通过反射可以动态获取或修改对象的字段值、调用方法,避免硬编码特定字段或方法名。
  • 与 AOP 配合:反射结合 Spring AOP,可以在切面中对任意方法或对象的操作进行记录,而不干扰核心业务逻辑。

2. 基本概念

2.1 反射的基础知识

  • 反射是什么
    Java 反射是指在运行时动态加载类、获取类的信息(如字段、方法、构造函数)、并进行操作的机制。

  • 反射的核心类

    • Class:获取类的元信息。
    • Field:代表类的字段,可以动态获取或设置字段值。
    • Method:代表类的方法,可以动态调用方法。
    • Constructor:表示构造函数,可以动态创建实例。
  • 反射的常用操作

    • 动态加载类:Class.forName("com.example.MyClass")
    • 获取字段值:Field field = clazz.getDeclaredField("fieldName")
    • 调用方法:Method method = clazz.getMethod("methodName", paramTypes)

2.2 Spring Boot 对象操作的场景

  • 操作日志记录:在 Controller 或 Service 层记录方法调用及对象的状态变化。
  • 动态数据处理:基于反射读取或更新实体类的字段值,例如批量处理数据库对象。
  • 调试与性能分析:动态注入调试逻辑或分析方法的调用频率和耗时。

3. 实现对象操作记录的基本思路

  • 获取修改前后两个对象,使用反射获取所有字段进行比对,从而记录修改的字段。

4. 代码实现

public void trackChanges(Object oldObj, Object newObj) {
    Field[] fields = oldObj.getClass().getDeclaredFields();
    StringBuilder content = new StringBuilder();
    for (Field field : fields) {
        field.setAccessible(true);
        if (Modifier.isPrivate(field.getModifiers())) {
            try {
                // 1.获取字段中文名
                String fullName = field.getName();
                String fieldName = fullName.substring(fullName.lastIndexOf(".") + 1);
                ApiModelProperty apiModelProperty = field.getAnnotation(ApiModelProperty.class);
                if (apiModelProperty != null) {
                    fieldName = apiModelProperty.value();
                }
                // 2.记录修改操作
                Object oldValue = field.get(oldObj);
                Object newValue = Optional.ofNullable(field.get(newObj)).orElse("");
                if (Objects.nonNull(oldValue) && !oldValue.equals(newValue)) {
                    content.append(fieldName).append("从: ").append(oldValue).append(",改为: ").append(newValue).append(";");
                }
            } catch (IllegalAccessException e) {
                throw new RuntimeException("日志反射填充出错!");
            }
        }
    }
}

5.扩展说明

  • 本次仅简单完成操作记录内容,后续有时间会考虑使用Spring AOP进行扩展以及源码提供。

标签:反射,记录,对象,Spring,Boot,field,操作,append
From: https://blog.csdn.net/2401_84279412/article/details/143693630

相关文章

  • SpringBoot+ElasticJob实现分布式任务调度
    目录1相关简介2Zookeeper的Docker安装3Zookeeper的Windows版本安装4Zookeeper图形化客户端prettyZoo5示例代码6添加任务监听器7参考资料(感谢)1相关简介zookeeper:开源分布式应用程序协调服务下载地址:https://archive.apache.org/dist/zookeeper/2Zookeeper......
  • springboot毕设保险客户管理系统程序+论文+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景在当今的保险行业中,随着市场竞争的日益激烈和客户需求的不断多样化,传统的客户管理方式已经难以满足企业发展的需求。保险企业面临着海量客户信息......
  • springboot毕设 酒店前台管理 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着旅游业的蓬勃发展和人们生活水平的提高,酒店行业迎来了前所未有的发展机遇。酒店前台作为客户与酒店之间的首要接触点,其管理效率和服务质量直接影......
  • springboot毕设 旧教材交易系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着教育事业的蓬勃发展,教材作为知识传播的重要载体,其更新换代速度日益加快。然而,在高校的图书管理系统中,旧教材的处理往往成为一个被忽视的环节。大......
  • springboot毕设 就业信息管理系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育的普及和就业市场的日益竞争激烈,就业信息管理成为了高校、企业及学生共同关注的焦点。传统的就业信息管理模式往往依赖于纸质材料、邮件......
  • 【SpringMVC】基础入门实战(3)
     阿华代码,不是逆风,就是我疯你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你!!目录一:实践1:获取header(1)普通方法 (2)简洁方法获取Header2:返回静态页面(1)返回静态页面失败(2)Controller(3)@RestController和@Controller关联3:返回数据@ResponseBody4:返回HTM......
  • springboot 接入shardingsphere-jdbc-core-spring-boot-starter
    环境springboot+mybatis-plus+driud注:druid引入方式请不要使用boot-starter方式<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>......
  • SpringBoot项目引入Elasticsearch时启动失败
    1、前情提要:https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/installation.html以上是Elasticsearch对接Java的官方文档(pom依赖部分)我本地Windows安装的Elasticsearch也是8.15.3版本 2、启动报错***************************APPLICATION......
  • springboot 汽车4s店管理系统的设计与实现【附源码】
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • springboot 社区便民服务管理系统的设计与实现【附源码】
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......