本文最后更新于:2024-12-01T08:55:14+08:00
Java 代理(agent)是一种拦截处理技术,它会在你的 Java 代码执行前进行拦截并按照你的要求进行字节码调整。
我们开发中使用的很多工具都是基于 Java 代理来实现的,比如 JRebel、以及诊断工具等。
Java Agent规范
因为其特殊性,Java Agent 规定,需要在 META-INF
目录下创建 MANIFEST.MF
文件,并在其内部指定 Agent 的启动类:
上述仅为示例文件,具体配置请根据实际情况处理
Java Agent 入口类
上述配置中设置了Premain-Class
和Agent-Class
的类路径,这代表着我们的 Agent 在不同的运行方式下会找不同的入口类。
Premain-Class
代表的是以-javaagent:*
的方式载入时,Agent 程序的入口类路径。
Agent-Class
则代表的是以 Attach API 的方式载入时,Agent 程序的入口类路径。
入口类的定义如下:
Maven Build
为了便于打包,一般我们会使用 Maven 的 Plugin 进行自动配置:
使用场景
Java Agent 结合 ASM 技术可以做到很多事情,主要包含以下几种场景:
- 日志记录
- 性能分析
- 热部署
- Mock服务
- 动态数据映射
- ……