JavaAgent技术之添加注解

发布时间:2026/9/17 11:54:03

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/9/11 17:29:11

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

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

2026/9/14 12:18:51

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

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

2026/9/17 11:49:48

多目标优化驱动车轮型面设计:NSGA-II与GPR的联合优化

简介:面向高速动车组轮缘磨耗抑制与曲线通过安全性提升,一份完整的论文复现资料,内含详细可运行代码及解释,适合车辆工程、机械设计相关科研人员、研究生及轨道行业工程师。压缩包为单个PDF文件,大小仅992KB&#xff0…

2026/9/17 11:49:48

员工心理援助项目(EAP)在国内企业中的应用现状-中国心理学会心理咨询师水平评价-心理咨询师培训机构-长春心理咨询师培训机构

员工心理援助项目(EAP)在国内企业中的应用现状-中国心理学会心理咨询师水平评价-心理咨询师培训机构-长春心理咨询师培训机构当一家公司开始关注员工的心理健康时,通常会首先想到员工心理援助项目——EAP(Employee Assistance Pro…

2026/9/17 11:49:48

通达信波段王副图指标源码详解:从KDJ到均线趋势过滤的大波段识别

简介:这是一份通达信波段王副图指标公式源码讲解文档,面向需要识别大波段机会的股票、期货投资者及技术分析入门者。文档围绕“波段王”副图指标展开,详细拆解了二十一日移动平均线、指数移动平均线、均价计算及多空柱线绘制的完整公式逻辑&a…

2026/9/17 11:49:48

2026温度采集模块选型指南:精度、隔离、成本与通信避坑

上个月帮一个做注塑机辅机的朋友理产线改造清单,卡在温度采集这一环整整两周。他们原方案是每台设备配一块进口采集板卡,单通道成本压不下来,八台机的预算一算就超了三成。后来把需求拆开重新捋——哪些点位必须0.1℃,哪些1℃就够…

2026/9/17 11:49:48

自卑感的心理学解析与自我超越路径-中国心理学会心理咨询师水平评价-心理咨询师培训机构-长春心理咨询师培训机构

自卑感的心理学解析与自我超越路径自卑感是人类最普遍的心理体验之一。几乎每个人在人生的某些阶段,都会体验到"我不够好""我不如别人"的感觉。适度的自卑感可以成为个人成长的动力,推动我们努力提升和完善自己。然而,当…

2026/9/17 11:44:47

DPDK-OVS高性能部署与调优实战指南

简介:本资源是一份面向网络工程师、SDN开发者及云计算基础设施技术人员的深度技术文档,系统讲解Open vSwitch与DPDK融合架构的设计原理与性能优化机制,解决传统OvS在高吞吐场景(如电信云、NFV平台)下受Linux内核协议栈…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/17 0:03:13

WiFi密码安全测试:从原理到实战的字典暴力破解指南

1. 写在前面:我为什么要研究WiFi密码这件事先交代一下背景。我身边有不少朋友,家里的WiFi密码常年是"12345678"或者"88888888",问就是"好记"。直到有一次,隔壁邻居蹭网蹭到我家路由器后台都进不去&…

2026/9/17 0:03:13

redis-py服务控制与监控函数实战:从ping到slowlog的巡检指南

我用 redis-py 写了快五年的业务代码,坦白说,真正让我觉得这个客户端“像一个成熟工具箱”的,不是 get/set 那套基本操作,而是它那批专门做服务控制与状态监控的辅助函数。日常开发里,大家把redis.Redis(host..., deco…

2026/9/17 0:03:13

SpringBoot+Vue3实现中小企业设备管理系统开发实践

1. 项目概述与核心价值中小企业设备管理系统是制造业、服务业等领域的基础信息化工具。传统设备管理往往依赖Excel表格或纸质记录,存在数据孤岛、流程混乱、维护成本高等痛点。这套基于Java SpringBootVue3MyBatis的技术方案,通过前后端分离架构实现了设…

2026/9/16 22:55:57

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/16 22:56:09

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/16 22:56:16

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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