Zacard's Notes

分布式追踪系统x-apm开发拾遗之javaagent

背景

x-apm开发周期比较短,开发过程中用到的一些知识点没有深入理解,这里记录下apm用到的入口知识点 – javaagent

什么是javaagent

javaagent是Java中用来增强JVM上的应用的一种方式,这样的agent有机会修改目标应用或者应用所运行的环境。它可通过访问Java Instrumentation API来修改目标应用程序的class字节码

为什么要有javaagent

  1. 暴露一些特定功能。比如运行时获得所有已加载类的字节码
  2. 对于特定类做低侵入甚至无侵入的增强。比如对某个类的某个方法插入特定逻辑

所以,javaagent的主要功能其实类似aop,但是其原理是加载class文件之前做拦截,直接修改字节码,或者运行时动态修改字节码;而aop是生成一个新的代理类

如何编写javaagent

核心api:java.lang.instrument.Instrumentation

Instrumentation其中一个优点就是能够让我们注册ClassFileTransformers。一个已注册的ClassFileTransformer将拦截所有应用程序类的加载,并能够访问他们的字节码。同时,也可以修改类的字节码

入口是一个premain方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class JavaAgentTest {
public static void premain(String args, Instrumentation instrumentation) {
// 仅仅只是保存了字节码到本地文件
instrumentation.addTransformer((loader, className, classBeingRedefined, protectionDomain, classfileBuffer) -> {
Path path = Paths.get("classes/" + className + ".class");
try {
Files.write(path, classfileBuffer);
} catch (IOException e) {
e.printStackTrace();
}
return classfileBuffer;
});
}
}

启动:java -javaagent:/path/to/agent.jar -jar app.jar

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章