JavaAgent 简介
- 定义: JDK提供的一种能力,允许开发者在运行时对已有class代码进行注入和修改。
- 用途: 增强和修改类执行,如IntelliJ IDEA使用JavaAgent增强JVM行为实现调试功能。
JavaAgent 工作原理
premain
方法: JavaAgent的入口点,接收agent参数和Instrumentation实例。transform
方法: 允许在类加载前修改字节码,使用字节码操作库(如ASM、Byte Buddy)。
实践 JavaAgent
- 步骤:
- 实现
ClassFileTransformer
接口: 重写transform
方法,实现字节码修改。 - 编写
MyAgent
类: 作为代理入口类,注册ClassFileTransformer
。 - 配置Jar信息: 打包代码为Jar包,配置MANIFEST.MF指定启动类和相关属性。
- 实现
方法执行耗时统计实现
CostTransformer
类: 限定只对特定类名后缀的类进行操作,实现方法耗时的统计。- 时间记录: 在方法执行前后插入时间记录代码,计算耗时。
- 代码示例: 使用javassist库对
UserController
的testCostTime
方法进行字节码修改。
代理入口类 (MyAgent
)
premain
方法: 注册CostTransformer
实例到Instrumentation实例。- 注意:
agentmain
通常用于JavaAgent附着启动,本文主要介绍premain
。
Jar包配置
- MANIFEST.MF: 配置文件,指定JavaAgent的启动类和属性。
Premain-Class
: 指定入口类。Can-Redefine-Classes
和Can-Retransform-Classes
: 允许类重定义和重转换。
使用JavaAgent
- 启动方式:
- 使用
-javaagent
选项启动Java应用程序。 - 使用Java Attach API在运行时附加代理。
- 使用