bytebuddy 进阶
bytebuddy入门介绍篇,总结了bytebuddy的功能和使用。bytebuddy是什么,
请看这里 源码解析详细版
这个写的不清晰,上面的更详细一点
一、ByteBuddyAgent
示例
博客
不同于使用-agent-jar参数的方式。bytebuddy自己实现了对Attach API的封装,可以直接将agent.jar加载。就是启动后主动attach到目标进程。
bytebuddy如何将类替换进内存。核心的函数是
net.bytebuddy.agent.install
方法。
可以先看VirtualMachine
和Instrument
完成扫盲。
1.1 Attacher 负责启动agent.jar
负责启动agent.jar包
只有一个方法install(),
- 接受一个jvm的pid,和jvm建立连接,执行attach,返回一个
VirtualMachine
。- 执行loadagentpath或者loadagent加载agent.jar并触发premain或者domain方法
- detach
1.2 Intaller Instrumention对象的载体
只要有有一个内部变量instrumention,用来包含对类的修改设定
很简单的getInstrumention
多了个权限策略的控制
premain agentmain
简单的赋值
1.3 VirtualMachine jvm平台的支持
支持的JVM,对JDK VirtualMachine的增强版
这里不需要细看
Resover获取 jvm平台信息
Resolver
OPENJ9
HotSpot
平台具体的attach处理,bytebuddy自己写的attach逻辑
1.4 ByteBuddyAgent(核心)
Provider
1. ProceessProvider
当前JVM pi的获取
2. AttachmentProvider
得到VirtulMachine用来attch的API
返回用来支持attach的Provider集合
内部实现了ACCESSOR,是对不同jvm的封装
用来attach的jvm的具体实现
3. AgentProvider
用来处理提供的jar文件或者agent.jar。
比如Agent-jar包中的Manifest
文件有PreMain-class
属性。
这个provider会
1 解析Manifest属性,设置到ByteBuddyAgent
的属性去
2 读取agent的jar包
4.AttachmentTypeEvaluator
install()方法
其他 attach()方法
底层也是调用了install方法
二、类型的描述
2.1 NamedElement.java
net.bytebuddy.description 用来承载和操作类型
- getActualName() sourcecode中的名称,没有就返回空""
- getName() 运行中,byte code中变量的名称,例如
int i=0
的i
- getInternalName() 运行中,byte code中变量的名称,以classfile变量方式,比如 常量池的序号
#1=int
中的#1
- isNa