SSM(九) 反射的实际应用 - 构建日志对象

简介: 相信做Java的童鞋或多或少都听过反射,这也应该是Java从入门到进阶的必经之路。但是在我们的实际开发中直接使用它们的几率貌似还是比较少的,(除了造轮子或者是Spring Mybatis这些框架外)。所以这里介绍一个在实际开发中还是小有用处的反射实例。

传统日志


有关反射的一些基本知识就不说了,可以自行Google,也可以看下反射入门


日志相信大家都不陌生,在实际开发中一些比较敏感的数据表我们需要对它的每一次操作都记录下来。


先来看看传统的写法:


@Test
    public void insertSelective() throws Exception {
        Content content = new Content() ;
        content.setContent("asdsf");
        content.setCreatedate("2016-12-09");
        contentService.insertSelective(content) ;
        ContentLog log = new ContentLog();
        log.setContentid(content.getContentid());
        log.setContent("asdsf");
        log.setCreatedate("2016-12-09");
        contentLogService.insertSelective(log);
    }


非常简单,就是在保存完数据表之后再把相同的数据保存到日志表中。


但是这样有以下几个问题:


  • 如果数据表的字段较多的话,比如几百个。那么日志表的setter()方法就得写几百次,还得是都写对的情况下。


  • 如果哪天数据表的字段发生了增加,那么每个写日志的地方都得增加该字段,提高了维护的成本。


针对以上的情况就得需要反射这个主角来解决了。


利用反射构建日志


我们先来先来看下使用反射之后对代码所带来的改变:


@Test
    public void insertSelective2() throws Exception {
        Content content = new Content();
        content.setContent("你好");
        content.setContentname("1");
        content.setCreatedate("2016-09-23");
        contentService.insertSelective(content);
        ContentLog log = new ContentLog();
        CommonUtil.setLogValueModelToModel(content, log);
        contentLogService.insertSelective(log);
    }


同样的保存日志,不管多少字段,只需要三行代码即可解决。


而且就算之后字段发生改变写日志这段代码仍然不需要改动。


其实这里最主要的一个方法就是CommonUtil.setLogValueModelToModel(content, log);


来看下是如何实现的;


/**
     * 生成日志实体工具
     *
     * @param objectFrom
     * @param objectTo
     */
    public static void setLogValueModelToModel(Object objectFrom, Object objectTo) {
        Class<? extends Object> clazzFrom = objectFrom.getClass();
        Class<? extends Object> clazzTo = objectTo.getClass();
        for (Method toSetMethod : clazzTo.getMethods()) {
            String mName = toSetMethod.getName();
            if (mName.startsWith("set")) {
                //字段名
                String field = mName.substring(3);
                //获取from 值
                Object value;
                try {
                    if ("LogId".equals(field)) {
                        continue;
                    }
                    Method fromGetMethod = clazzFrom.getMethod("get" + field);
                    value = fromGetMethod.invoke(objectFrom);
                    //设置值
                    toSetMethod.invoke(objectTo, value);
                } catch (NoSuchMethodException e) {
                    throw new RuntimeException(e);
                } catch (InvocationTargetException e) {
                    throw new RuntimeException(e);
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }


再使用之前我们首先需要构建好主的数据表,然后new一个日志表的对象。


setLogValueModelToModel()方法中:


  • 分别获得数据表和日志表对象的类类型。


  • 获取到日志对象的所有方法集合。


  • 遍历该集合,并拿到该方法的名称。


  • 只取其中set开头的方法,也就是set方法。因为我们需要在循环中为日志对象的每一个字段赋值。


  • 之后截取方法名称获得具体的字段名称。


  • 用之前截取的字段名称,通过getMethod()方法返回数据表中的该字段的getter方法。


  • 相当于执行了String content = content.getContent();


  • 执行该方法获得该字段具体的值。


  • 利用当前循环的setter方法为日志对象的每一个字段赋值。


  • 相当于执行了log.setContent("asdsf");


其中字段名称为LogId时跳出了当前循环,因为LogId是日志表的主键,是不需要赋值的。


当循环结束时,日志对象也就构建完成了。之后只需要保存到数据库中即可。


总结


反射其实是非常耗资源的,再使用过程中还是要慎用。


其中对method、field、constructor等对象做缓存也是很有必要的。


项目地址:github.com/crossoverJi…

个人博客地址:crossoverjie.top

GitHub地址:github.com/crossoverJi…


相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
4月前
|
SQL 人工智能 监控
SLS Copilot 实践:基于 SLS 灵活构建 LLM 应用的数据基础设施
本文将分享我们在构建 SLS SQL Copilot 过程中的工程实践,展示如何基于阿里云 SLS 打造一套完整的 LLM 应用数据基础设施。
896 78
|
5月前
|
存储 运维 监控
金蝶云•星辰基于 SLS 构建稳定高效可观测系统
金蝶云•星辰通过阿里云日志服务 SLS 替换自建 ELK 系统,构建统一可观测平台,有效应对业务高速增长带来的稳定性挑战,提升运维效率与系统稳定性,助力企业数字化转型。
|
7月前
|
监控 安全 Linux
AWK在网络安全中的高效应用:从日志分析到威胁狩猎
本文深入探讨AWK在网络安全中的高效应用,涵盖日志分析、威胁狩猎及应急响应等场景。通过实战技巧,助力安全工程师将日志分析效率提升3倍以上,构建轻量级监控方案。文章详解AWK核心语法与网络安全专用技巧,如时间范围分析、多条件过滤和数据脱敏,并提供性能优化与工具集成方案。掌握AWK,让安全工作事半功倍!
281 0
|
10月前
|
存储 消息中间件 缓存
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
基于阿里云SelectDB,MiniMax构建了覆盖国内及海外业务的日志可观测中台,总体数据规模超过数PB,日均新增日志写入量达数百TB。系统在P95分位查询场景下的响应时间小于3秒,峰值时刻实现了超过10GB/s的读写吞吐。通过存算分离、高压缩比算法和单副本热缓存等技术手段,MiniMax在优化性能的同时显著降低了建设成本,计算资源用量降低40%,热数据存储用量降低50%,为未来业务的高速发展和技术演进奠定了坚实基础。
478 1
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
|
10月前
|
存储 监控 算法
基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
285 3
|
11月前
|
运维 应用服务中间件 nginx
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
1874 28
|
10月前
|
SQL 数据库
【YashanDB知识库】应用绑定参数的慢查询,慢日志抓取不到
【YashanDB知识库】应用绑定参数的慢查询,慢日志抓取不到
|
11月前
|
SQL 分布式计算 Serverless
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
289 0
|
11月前
|
存储 弹性计算 运维
海量日志接入 Elasticsearch Serverless 应用降本70%以上
本文将探讨在日志场景下,使用阿里云Elasticsearch Serverless相较于基于ECS自建Elasticsearch集群的成本与性能优势,展示如何通过Serverless架构实现高达 70%以上的成本节约。
595 0