sp;文件的一些参数,允许我们重新定义类。如果你的 agent 实现还需要引用一些其他类库时,还需要将这些类库都打包到此 jar 包中,下面是我的 pom 文件配置。
另外在打包时需要使用 mvn assembly:assembl
命令生成 jar-with-dependencies 作为 agent。
我在测试时写了一个用以上技术实现了一个简单的字节码动态修改的 Demo。
TransformTarget 是要被修改的目标类,正常执行时,它会三秒输出一次 “hello”。
Agent 是执行修改类的主体,它使用 ASM 修改 TransformTarget 类的方法,并使用 instrument 包将修改提交给 JVM。
入口类,也是代理的 Agent-Class。
执行字节码修改和转换的类。
使用 tools.jar 里方法将 agent 动态加载到目标 JVM 的类。
这样,先启动 TransformTarget 类,获取到 pid 后将其传入 Attacher 里,并指定 agent jar,将 agent attach 到 TransformTarget 中,原来输出的 “hello” 就变成我们想要修改的 “bytecode replaced!” 了。
掌握了字节码的动态修改技术后,再回头看 Btrace 的原理就更清晰了,稍微摸索一下我们也可以实现一个简版的。另外很多大牛实现的各种 Java 性能分析工具的技术栈也不外如此,了解了这些,未来我们也可以写出适合自己的工具,至少能对别人的工具进行修改~
不得不说 Java 的生态真的非常繁荣,当真是博大精深,查阅一个模块的资料时能总引出一大堆新的概念,永远有学不完的新东西。