尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

JavaAgent技术之添加注解

JavaAgent技术之添加注解
📅 发布时间:2026/7/28 16:40:38
什么是JavaAgent(Java探针)?你可以理解为Java版AOP。只不过这个AOP项目启动时运行一次

JavaAgent 只在项目启动时运行一次并且是java文件编译成class文件后才运行。所以不会影响到class文件。
JavaAgent 是寄生项目。即需要依赖一个正常项目才能运行

我这里演示使用 IDE 为 IDEA ,项目为maven普通项目结构,可以很方便的帮助我们创建一个 JavaAgent 项目。
  1. 按住CTRL+SHIFT+ALT+S 键,进入Project Structure界面
  2. 选择添加JAR
  3. 选择项目,注意下面的链接要在SRC下。
  4. 创建好的目录结构,其中Premain-Class 是我后期添加上去的。这里指定的为后面的 Agent 类中的 premain 方法。同时也是JavaAgent的启动方法,Class-path中的值也是我们在maven中添加的包。你们应该没有
  5. 编写一个JavaAgent方法
packagecom.annie;importjava.lang.instrument.Instrumentation;publicclassAgent{// JavaAgent启动时调用的方法publicstaticvoidpremain(String args,Instrumentation instrumentation){System.out.println("传入的参数为: "+args);System.out.println("JavaAgent启动了...");}}

到这里一个JavaAgent项目就基本启动完成了。我们在创建一个普通项目(项目类型无所谓)

这里我创建的是一个SpringBoot的项目,因为比较好演示。
  1. 先将将JavaAgent编译jar包,编译好的jar包就在项目同级目录下的out下面。
  2. 设置启动配置,后面一个Hello是传入的参数。可有可无。不要时不要忘记连 = 号也去掉。
-javaagent:C:\Users\13100\Documents\IdeaProjects\BaseJava\out\artifacts\JavaAgent_jar\JavaAgent.jar=Hello
  1. 保存运行
到这里一个JavaAgent项目就基本搭建成功了。当然我们不能满足于此。这里我自演示基本的动态注解其实以下就没有和JaveAgent相关内容了。
  1. 添加javassist包。
<!-- https://mvnrepository.com/artifact/org.javassist/javassist --><dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.25.0-GA</version></dependency>
  1. 编写代码(写完不要忘记重新编译)
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 classPool=ClassPool.getDefault();try{// 创建一个新的 class 类。classfileBuffer 就是当前class的字节码CtClass ctClass=classPool.makeClass(newByteArrayInputStream(classfileBuffer));ClassFile classFile=ctClass.getClassFile();ConstPool constPool=classFile.getConstPool();// 从这里取出原本类中的注解 建议DEBUG看下attributes中的数据List<AttributeInfo>attributes=classFile.getAttributes();AnnotationsAttribute attributeInfo=(AnnotationsAttribute)attributes.get(1);// 导包是javassist的包// 添加新的注解Annotation annotation=newAnnotation("org.springframework.web.bind.annotation.RequestMapping",constPool);attributeInfo.addAnnotation(annotation);// 返回新的字节码returnctClass.toBytecode();}catch(Exceptione){e.printStackTrace();}}returnnewbyte[0];}});}}
  1. 编写一个 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<?extendsTestController>aClass=this.getClass();Annotation[]declaredAnnotations=aClass.getDeclaredAnnotations();StringBuffer sb=newStringBuffer();// 查看类上全部注解for(Annotation annotation:declaredAnnotations){sb.append(annotation.toString()+"\n");}returnsb.toString();}}
  1. 浏览器上输入 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
个人博客

相关新闻

  • 呼叫中心CRM对接实战:API联动原理、来电弹屏、数据同步与业务闭环落地方案
  • AI普通话智能评测系统:核心技术解析与应用实践
  • Gitee本土化优势与开发者实战指南

最新新闻

  • 2026精选金牛区保洁公司综合实力排行名单一览 - 起跑123
  • C++引用:从基础别名到现代移动语义的深度解析与实战指南
  • 【剑指Offer】斐波那契数列之青蛙跳台阶
  • 前端转网安真的快吗,JavaScript 技能在渗透测试中到底能省多少力
  • 杭州企业财税业务服务商推荐|2026 正规财税公司十个甄选浙江乘风财务咨询有限公司:疑难税务代办/资质代办/补贴代办财税 - 栗子测评
  • 2026新版三明防水补漏服务商参考|阳台渗漏修缮方案指南 - 筑宅安

日新闻

  • 力旷智能:伺服驱动系统在制药收瓶设备中的应用解析
  • 2026 网安入门避坑指南,零基础如何避开无效学习直接上手实战
  • 揭秘CFC项目:如何通过手机摄像头实现850kbps无网络文件传输

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号