发布时间:2026/7/28 16:36:06
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/7/28 16:31:05

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

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

2026/7/28 16:31:05

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

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

2026/7/28 19:46:52

使用java反射机制,获取已存在类的信息

使用java反射机制,获取已存在类的信息 反射就是把java类中的各种成分映射成一个个的Java对象 例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象…

2026/7/28 19:46:52

如何搭建充电桩管理系统?开发全流程与核心模块详解

博主介绍: 所有项目都配有从入门到精通的安装教程,可二开,提供核心代码讲解,项目指导。 项目配有对应开发文档、解析等 项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行&#xff…

2026/7/28 19:46:52

Bayes-SVM分类算法:原理、实现与医疗诊断应用

1. 项目概述:Bayes-SVM分类算法解析在机器学习领域,分类算法的优化一直是个热门话题。最近我在一个医疗诊断项目中尝试了Bayes-SVM(贝叶斯优化支持向量机)方法,效果出乎意料地好。这种将贝叶斯优化与支持向量机结合的方…

2026/7/28 19:46:51

C++入门核心:从程序骨架到函数与类的完整指南

1. 从“Hello World”到理解程序骨架很多朋友学C,第一步就是照着教程敲一个“Hello World”,然后看着黑框框里蹦出那几个字,感觉好像会了,又好像什么都没会。这感觉我懂,当年我也是这么过来的。今天我们不急着去搞那些…

2026/7/28 19:41:51

SpringBoot+Vue旅游网站管理平台开发实践

1. 项目概述:旅游网站管理平台的技术栈与定位这个基于SpringBootVue的旅游网站管理平台,本质上是一个典型的B/S架构企业级应用。前端采用Vue.js构建响应式界面,后端使用SpringBoot提供RESTful API,数据存储选用MySQL关系型数据库。…

2026/7/28 13:41:25

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

2026/7/28 0:03:34

学术论文研究创新点梳理与核心价值提炼指南

本科毕业论文是大学四年最大的坎。开题报告憋一周写不出三页,找文献翻遍十几个网站还是缺关键资料,写正文卡壳半天憋不出一句话,降重改到凌晨三点结果逻辑全乱,答辩前一天PPT还没做完。别慌,亲测这四个工具能让你少熬半…

2026/7/28 0:03:34

开发商售楼处数字化升级怎么做?

房企的数字化转型投入正在快速增长,据行业数据显示,2025年房企数字化投入规模已突破800亿元,年复合增长率达35%。售楼处的数字化升级不是单一环节的改造,而是从“获客-展示-成交-服务”全链路的系统升级。数字化升级四步法第一步&…

2026/7/28 0:03:34

模型不再值钱之后,AI 编程工具在争什么

2026 年 7 月,AI 编程工具赛道发生了一个标志性转折:模型本身不再值钱了。当 Kimi K3 开源模型在编程基准上击败 GPT 和 Claude,当 GitHub Copilot 第一次把开源模型纳入选择器,当 OpenAI 把 Codex 并入 ChatGPT 做成三合一超级应…

2026/7/28 4:38:09

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…