JavaAgent技术之添加注解

发布时间:2026/11/7 20:44:14

JavaAgent技术之添加注解 什么是JavaAgent(Java探针)你可以理解为Java版AOP。只不过这个AOP项目启动时运行一次JavaAgent 只在项目启动时运行一次并且是java文件编译成class文件后才运行。所以不会影响到class文件。JavaAgent 是寄生项目。即需要依赖一个正常项目才能运行我这里演示使用 IDE 为 IDEA 项目为maven普通项目结构可以很方便的帮助我们创建一个 JavaAgent 项目。按住CTRLSHIFTALTS 键进入Project Structure界面选择添加JAR选择项目注意下面的链接要在SRC下。创建好的目录结构其中Premain-Class 是我后期添加上去的。这里指定的为后面的 Agent 类中的 premain 方法。同时也是JavaAgent的启动方法Class-path中的值也是我们在maven中添加的包。你们应该没有编写一个JavaAgent方法packagecom.annie;importjava.lang.instrument.Instrumentation;publicclassAgent{// JavaAgent启动时调用的方法publicstaticvoidpremain(String args,Instrumentation instrumentation){System.out.println(传入的参数为: args);System.out.println(JavaAgent启动了...);}}到这里一个JavaAgent项目就基本启动完成了。我们在创建一个普通项目项目类型无所谓这里我创建的是一个SpringBoot的项目因为比较好演示。先将将JavaAgent编译jar包编译好的jar包就在项目同级目录下的out下面。设置启动配置后面一个Hello是传入的参数。可有可无。不要时不要忘记连 号也去掉。-javaagent:C:\Users\13100\Documents\IdeaProjects\BaseJava\out\artifacts\JavaAgent_jar\JavaAgent.jarHello保存运行到这里一个JavaAgent项目就基本搭建成功了。当然我们不能满足于此。这里我自演示基本的动态注解其实以下就没有和JaveAgent相关内容了。添加javassist包。!-- https://mvnrepository.com/artifact/org.javassist/javassist --dependencygroupIdorg.javassist/groupIdartifactIdjavassist/artifactIdversion3.25.0-GA/version/dependency编写代码写完不要忘记重新编译packagecom.annie;importjavassist.ClassPool;importjavassist.CtClass;importjavassist.bytecode.AnnotationsAttribute;importjavassist.bytecode.AttributeInfo;importjavassist.bytecode.ClassFile;importjavassist.bytecode.ConstPool;importjavassist.bytecode.annotation.Annotation;importjava.io.ByteArrayInputStream;importjava.io.IOException;importjava.lang.instrument.ClassFileTransformer;importjava.lang.instrument.IllegalClassFormatException;importjava.lang.instrument.Instrumentation;importjava.security.ProtectionDomain;importjava.util.List;publicclassAgent{// JavaAgent启动时调用的方法publicstaticvoidpremain(String args,Instrumentation instrumentation){System.out.println(传入的参数为: args);System.out.println(JavaAgent启动了...);// instrumentation 中包含了项目中的全部类。每加载一次.class文件就运行一次instrumentation.addTransformer(newClassFileTransformer(){Overridepublicbyte[]transform(ClassLoader loader,String className,Class?classBeingRedefined,ProtectionDomain protectionDomain,byte[]classfileBuffer)throwsIllegalClassFormatException{// 这里我只捕捉自己写 TestController 类if(className.equals(com/annie/controller/TestController)){// 接下来就是javassist的使用我会粗略的写下备注。不会详解。// 获取一个 class 池。ClassPool classPoolClassPool.getDefault();try{// 创建一个新的 class 类。classfileBuffer 就是当前class的字节码CtClass ctClassclassPool.makeClass(newByteArrayInputStream(classfileBuffer));ClassFile classFilectClass.getClassFile();ConstPool constPoolclassFile.getConstPool();// 从这里取出原本类中的注解 建议DEBUG看下attributes中的数据ListAttributeInfoattributesclassFile.getAttributes();AnnotationsAttribute attributeInfo(AnnotationsAttribute)attributes.get(1);// 导包是javassist的包// 添加新的注解Annotation annotationnewAnnotation(org.springframework.web.bind.annotation.RequestMapping,constPool);attributeInfo.addAnnotation(annotation);// 返回新的字节码returnctClass.toBytecode();}catch(Exceptione){e.printStackTrace();}}returnnewbyte[0];}});}}编写一个 TestController这里我只给了RestController的注解。并没有给RequestMapping注解。RequestMapping由JavaAgent为我添加。packagecom.annie.controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjava.lang.annotation.Annotation;RestControllerpublicclassTestController{RequestMapping(/test)publicStringtest(){// 利用反射查看Class注解。Class?extendsTestControlleraClassthis.getClass();Annotation[]declaredAnnotationsaClass.getDeclaredAnnotations();StringBuffer sbnewStringBuffer();// 查看类上全部注解for(Annotation annotation:declaredAnnotations){sb.append(annotation.toString()\n);}returnsb.toString();}}浏览器上输入 127.0.0.1:8080/test 查看TestController上的注解补充内容 linux 上发布项目将javaAgent.jar 和 javaassist.jar 放入到一个文件夹中。运行命令java -javaagent:JavaAgent.jar -jar web-test-0.0.1-SNAPSHOT.jar项目就启动成功。注意一点这个jar包就是你bulid出来的JAR扩展内容github个人博客
延伸阅读

更多相关文章

2026/11/2 12:06:56

企业私域流量团队搭建与高效运营指南

1. 私域运营团队搭建的核心逻辑 私域流量运营已经成为企业数字化营销的标配能力,但90%的企业在团队搭建阶段就埋下了失败的种子。我在操盘多个行业头部品牌的私域项目时发现,团队架构与业务规模的匹配度直接决定了私域ROI的高低。一个200人团队的配置方案…

2026/11/2 13:24:52

AI语音合成技术新突破:情感编程与全场景建模

1. AI语音赛道再添新玩家:Miravoice获630万美元融资背后的技术逻辑上周行业最值得关注的融资事件莫过于Miravoice完成630万美元种子轮融资。这家成立仅18个月的初创公司,核心团队来自多家知名语音技术实验室,其技术路线选择在当下同质化严重的…

2026/11/7 20:40:10

电工证招生话术简短全国通用怎么报?怕考不过白交培训费?

电工证招生话术简短全国通用怎么报?怕考不过白交培训费? 怕考不过白交培训费?别急,先看清这些细节,再报名不亏! 在应急管理领域,电工证作为特种作业操作证的一种,已经成为众多从业人员的“刚需”。尤其是在濮阳房建工程行业中,电工证不仅关乎上岗资…

2026/11/7 20:35:10

横店那里可考电工证保姆级教程:工地太忙根本没时间复习考试

横店那里可考电工证保姆级教程:工地太忙根本没时间复习考试 工地太忙根本没时间复习考试?你是横店工地上的电工,每天穿梭在钢筋水泥之间,忙得连饭都顾不上吃,更别提抽出时间复习电工证考试了。但别小看这本证,它不仅是你工作的“通行证”,更是你职业生…

2026/11/7 14:54:47

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/7 14:50:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/7 0:03:08

郑州报考避坑指南:电工证和钳工证怎么选?实操考试心里没底怕挂科

郑州报考避坑指南:电工证和钳工证怎么选?实操考试心里没底怕挂科 实操考试心里没底怕挂科?你不是一个人。特别是在郑州这样的城市,很多施工企业负责人和一线作业人员在报考电工证和钳工证时都面临着同样的困惑。到底该考哪个证?哪个更适合自己?哪个证书…

2026/11/7 0:03:08

广西电工证办理流程全解析:外省证怎么转?在哪考最靠谱?

广西电工证办理流程全解析:外省证怎么转?在哪考最靠谱? 之前考的证在外省能不能转过来?这个问题我遇到太多了,今天就拿广西电工证办理流程来具体说说,别再走弯路了。广西电工证的报考、复审、继续教育这些环节,如果你不了解,真的会吃大亏,尤其对于从…

2026/11/7 0:03:08

电气电工证都有哪些保姆级教程

电气电工证都有哪些保姆级教程 你是不是正愁不知道去哪报名,怕被中介坑?别急,这篇保姆级教程专为河南初次报考人员准备,帮你搞清楚 电气电工证都有哪些 ,以及如何避开那些坑。 电气电工证都有哪些?别被五花八门的证书搞懵了…

2026/11/7 14:54:47

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/7 14:50:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑