写在前面
Java Instrumentation API 提供动态修改或增强类的能力,常用于性能分析、日志注入、AOP(面向切面编程)、监控等场景。
核心概念
-
Instrumentation
- 是
java.lang.instrument包中的核心接口。 - 提供修改类定义和获取 JVM 相关信息的能力。
- 是
-
Agent
- Java Agent 是一个特殊的 JAR 文件,通过 Instrumentation API 操作字节码。
- 在 JVM 启动时(通过
premain方法)或运行时(通过agentmain方法)加载。
-
ClassFileTransformer
- 用于拦截和修改类的字节码。
- 开发者可以在类加载前对类的字节码进行操作。
Instrumentation 接口方法
| 方法名 | 作用 |
|---|---|
addTransformer(ClassFileTransformer transformer) | 添加字节码转换器。 |
redefineClasses(ClassDefinition... definitions) | 重新定义已经加载的类。 |
isRedefineClassesSupported() | 检查是否支持类重定义。 |
isRetransformClassesSupported() | 检查是否支持类重新转换。 |
getAllLoadedClasses() | 获取 JVM 中所有已加载的类。 |
getObjectSize(Object obj) | 获取对象占用的内存大小。 |