Bytecode Manipulation - Java Agent Practice
概念
Instrument
- Instrument 是 JVM 提供的一个可以修改已加载类的类库,依赖于 JVMTI 的 Attach API 机制
- 要使用 Instrument 的类修改功能,需要实现
java.lang.instrument.ClassFileTransformer
接口- 可以在
ClassFileTransformer#transform
中利用 ASM 或者 Byte Buddy 等工具对字节码进行操作
- 可以在
- Instrument 通过与 Java Agent 结合来注入到 JVM 中
JVMTI & Agent
- JPDA(Java Platform Debugger Architecture)是 JDK 标准,必须实现
- 如果 JVM 启动时开启了 JPDA,那么类是允许被重新加载的
- 已加载的旧版类信息被卸载,然后重新加载新版本的类
- JVMTI 是 JVM 提供的一套对 JVM 进行操作的工具接口,Agent 是 JVMTI 的一种实现
- Attach API 的作用:提供 JVM 进程间通信的能力
- Attach 后,目标 JVM 在运行时走到 Agent 中定义的
agentmain
方法
- Attach 后,目标 JVM 在运行时走到 Agent 中定义的
Modules
1 | $ tree -L 1 |
App
1 | <dependency> |
1 |
|
1 | $ mvn clean package spring-boot:repackage |
Static Load
1 | public class PremainAgent { |
1 | <build> |
1 | $ mvn clean package |
Dynamic Load
Dynamic Agent
1 | public class AgentMain { |
1 | <build> |
1 | $ mvn clean package |
Agent Loader
1 |
|
1 | <dependency> |
1 | $ mvn clean package spring-boot:repackage |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.