public class Attacher { public static void main(String[] args) throws AttachNotSupportedException, IOException, AgentLoadException, AgentInitializationException { VirtualMachine vm = VirtualMachine.attach("34242"); // 目标 JVM pid vm.loadAgent("/path/to/agent.jar"); } }
这样,先启动 TransformTarget 类,获取到 pid 后将其传入 Attacher 里,并指定 agent jar,将 agent attach 到 TransformTarget 中,原来输出的 “hello” 就变成我们想要修改的 “bytecode replaced!” 了。
小结掌握了字节码的动态修改技术后,再回头看 Btrace 的原理就更清晰了,稍微摸索一下我们也可以实现一个简版的。另外很多大牛实现的各种 Java 性能分析工具的技术栈也不外如此,了解了这些,未来我们也可以写出适合自己的工具,至少能对别人的工具进行修改~
不得不说 Java 的生态真的非常繁荣,当真是博大精深,查阅一个模块的资料时能总引出一大堆新的概念,永远有学不完的新东西。