Java关于AbstractProcessor的使用

2023-09-20 20:26:41

背景:我们都知道,在正常情况下,我们无法去变更二方,三方包中源码的Java文件的内容,但是在某些场景下,我们又希望可以去改动源码中的java文件中的代码,让其最终编译出来以后加载到Jvm当中的是我们改动以后的文件,那么有这样的一种方式可以做到,就是AbstractProcessor,下面给大家看一个例子,原理就是AbstractProcessor提供了一个process的抽象方法,允许你在应用的编译期进行一些处理,在你的Java文件还未编译成class文件时,你可以利用这种机制去更改Java文件,使得应用最终加载到Jvm中的class文件是你更改以后的文件,以此来达到更改源码文件内容的效果

Step1 项目准备

准备一个SpringBoot应用与一个父子模块的应用,目录结构如下
SpringBoot应用:
在这里插入图片描述
父子模块的应用(主要是为了在这个模块中开发AbstractProcessor二方包,让SpringBoot引用):
在这里插入图片描述

Step2 开发一个自定义的AbstractProcessor

首先因为AbstractProcessor本身是属于jdk的rt包总的内容,所以不需要额外引入。但是需要引入如下依赖
在这里插入图片描述
这个依赖主要是为了使得应用可以自动生成META-INF/services/javax.annotation.processing.Processor文件的,这个文件是为了激活我们自己定义的AbstractProcessor,是必不可少的。
然后我们再定义一个注解,这个注解是为了可以在AbstractProcessor的process让我们去识别处理的,可以理解为触发机制,比如我标注了这个注解,那么才需要去做一些编译期的替换内容的动作
整体的目录结构如下,@CompileTag注解的内容则是我们自定义的一些内容了,比如我可以设计一个源文件字段,一个目标文件字段,编译期想做的事情就是去把这两个文件做一个替换等等
在这里插入图片描述
那么接下来再看看我们自定义的编译器Processor是长啥样的
![在这里插入图片描述](https://img-blog.csdnimg.cn/db73aea3a0694d538bab53b662a445fd.png
@SupportedAnnotationTypes标识了这个编译器所支持的注解
@SupportedSourceVersion标识了这个编译器所支持的Java版本
@AutoService(Processor.class)则是为了生成META-INF/services/javax.annotation.processing.Processor文件的注解

那么核心其实就是在prosess方法里面的逻辑了,这个就是要自己开发拉
在这里插入图片描述

Step3 Debug AbstractProcessor替换源码内容

当我们开发完以后就要去debug我们的处理器,看是否有生效了,我们在demoSync中引入shutdown的二方包,这样就引入了我们对应的处理器,然后在应用中打上CompileTag注解,方便识别
debug方式:
第一步:在idea的terminal控制台输入mvnDebug clean install进行回车,会看到如下界面
在这里插入图片描述
第二步:创建一个连接8000端口的Jvm Debug进程
在这里插入图片描述
然后运行该debug,并且在自己的processor方法处打上断点,不一会儿就可以看到断点进来了

运行SpringBoot应用测试源码内容是否成功替换

我自己的话是实验了一下在org.springframework.boot.autoconfigure.jdbc.DataSourceProperties的afterPropertiesSet方法执行处多执行一行代码,日志做一个打印,是有正确输出的,因此还是比较有成就感的哈哈

更多推荐

「大数据-0」虚拟机VMware安装、配置、使用、创建虚拟机集群教程

目录一、下载VMwareWworkstationPro16二、安装VMwareWworkstationPro16三、检查与设置VMware的网卡1.检查2.设置VMware网段四、在VMware上安装Linux虚拟机五、对安装好的虚拟机进行设置1.打开设置2.设置中文3.修改字体大小4.修改终端字体大小5.关闭虚拟机六

4.1.9-映射应用程序体系结构

映射应用程序体系结构IDWSTG-INFO-10总结为了有效地测试应用程序,并能够就如何解决所识别的任何问题提供有意义的建议,了解实际测试的内容非常重要。此外,确定是否应将特定组件视为超出测试范围可能会有所帮助。现代Web应用程序的复杂性差异很大,从在单个服务器上运行的简单脚本到分布在数十个不同系统、语言和组件的高度复

华为云云耀云服务器L实例评测-基于华为云服务器的测试及简单配置

引言云计算已经成为现代企业和个人的重要组成部分。在云计算市场上,华为云一直以来都以其出色的性能和服务质量而闻名。周末的时候,利用华为云云耀云服务器搭建了一个基于hexo的个人博客,我用的是2核2G的3M带宽的配置,访问起来挺丝滑的,记录一下本次对华为云的一些测试及看法,探讨其性能、可靠性以及适用场景,帮助您更好地了解这

【python数据分析基础】—pandas中loc()与iloc()的介绍与区别

文章目录前言一、loc[]函数二、iloc[]函数三、详细用法loc方法iloc方法总结共同点不同点前言我们经常在寻找数据的某行或者某列的时常用到Pandas中的两种方法iloc和loc,两种方法都接收两个参数,第一个参数是行的范围,第二个参数是列的范围。一、loc[]函数loc:接收的是行、列的名称或标签。在切片是按

【送书活动】网络安全(黑客)自学

前言「作者主页」:雪碧有白泡泡「个人网站」:雪碧的个人网站「推荐专栏」:★java一站式服务★★React从入门到精通★★前端炫酷代码分享★★从0到英雄,vue成神之路★★uniapp-从构建到提升★★从0到英雄,vue成神之路★★解决算法,一个专栏就够了★★架构咱们从0说★★数据流通的精妙之道★★后端进阶之路★文章目

以太网媒体接口MII/RMII/SMII/GMII/RGMII/SGMII

以太网媒体接口MII/RMII/SMII/GMII/RGMII/SGMIIGMAC系统框架(EMAC是百兆mac,GMAC是千兆mac)网卡网卡系统框架结构PHY(PhysicalLayer,物理层)MAC(MediaAccessControl、媒体访问控制器)以太网结构大框架MAC硬件框图MII(MediaIndep

使用cpolar配合Plex搭建私人媒体站

文章目录1.前言2.Plex网站搭建2.1Plex下载和安装2.2Plex网页测试2.3cpolar的安装和注册3.本地网页发布3.1Cpolar云端设置3.2Cpolar本地设置4.公网访问测试5.结语1.前言用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各种碎片时间(追剧下饭、地铁上刷剧等等),看

设计模式:单例模式

目录什么是单例模式为什么使用单例模式常见的单例写法1.懒汉式(LazyInitialization)2.双重检查锁定(Double-CheckedLocking)3.饿汉式(EagerInitialization)4.枚举实现单例总结什么是单例模式单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点来

Docker Compose

DockerCompose是一个用于定义和运行多容器Docker应用程序的工具。它使用一个YAML文件来配置应用程序的服务、网络和存储等方面,并使用简单的命令来管理应用程序的生命周期。使用DockerCompose,你可以将多个容器(即服务)组合在一起,形成一个完整的应用程序。每个服务都可以由一个或多个容器组成,并且可

Redis分布式锁及其常见问题解决方案

Redis是一种内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理。由于其高性能和灵活的数据结构,Redis被广泛应用在各种场景中,包括实现分布式锁。分布式锁是一种在分布式系统中实现互斥访问的技术。在许多实际应用场景中,我们需要确保某些操作在同一时间只能被一个节点执行,例如更新共享资源、处理任务队列等。这时,我

【线性代数】沉浸式线性代数在线学习网站

地址:http://immersivemath.com/ila/index.html这是全球第一本带交互式图形的线性代数教材,作者是J.Ström,K.Åström,andT.Akenine-Möller。全书一共十章,各章节内容如下:接下来我将对各章节进行简单的总结,另外请注意,阅读过程中请一定不要忘记各章节提供的的

热文推荐