基于ASM-tree API的字节码修改工具
旨在快速构建基于ASM的Instrumentation方案
- Interceptor
- 拦截器用户界面
- doOnStart 拦截的目标方法开始位置执行操作
- doOnThrowableThrown 拦截的目标代码主动抛出异常时执行的操作
- doOnThrowableSurprise 拦截的目标代码意外异常抛出时执行的操作
- doOnFinish 希望在finally中执行的操作
- 正常结束时执行
- 代码异常抛出时执行
- 代码未捕获异常抛出时执行
- Match规则
- matchBeforeReadClass ASM读取类文件读取后的匹配规则
- matchAfterReadClass ASM读取类文件后匹配规则
- matchMethod 目标方法匹配规则
- 拦截器用户界面
- Matcher 匹配目标类,目标方法
- 利用Matcher快捷的组装Interceptor的Match规则
- Class Matcher
- Method Matcher
- Basic Matcher
- Matcher Interface
- Modifier 字节码修改器:类修改器,方法修改器
- ClassModifier,静态方法modify作为入口
- MethodModifier,没有对外暴露的方法
- Insn Creator
- 工具类,创建可复用的指令列表
- javaagent-example
- 如何创建一个javaagent
- target-example
- 如何将一个javaagent应用到目标上
- 现有的手段没有办法满足需求,字节码修改做为仅有的手段时
- 无侵入监控
- 构建Instrumentation
- 创建Premain
- 实现ClassFileTransformer
- 实现Interceptor
- 在manifest中指定PremainClass(比如Maven插件maven-jar-plugin可以完成此工作)
- 将编译好的Jar包放到目标的项目的ClassPath中
- 在目标项目启动命令上附加-javaagent参数项,参数内容为agentJar的路径
- 参数示例:-javaagent:/Users/tianyu/Desktop/example-javaagent-1.0-SNAPSHOT.jar=NAME_START_WITH;com.tianpl.opcode.example.target
- agentJar所以依赖的当前的ClassPath中
- 单独管理agentJar的ClassPath
- 将agentJar打包成fatJar
- 目标项目中增加依赖