背景
x-apm开发周期比较短,开发过程中用到的一些知识点没有深入理解,这里记录下apm用到的入口知识点 – javaagent
什么是javaagent
javaagent是Java中用来增强JVM上的应用的一种方式,这样的agent有机会修改目标应用或者应用所运行的环境。它可通过访问Java Instrumentation API来修改目标应用程序的class字节码
为什么要有javaagent
- 暴露一些特定功能。比如运行时获得所有已加载类的字节码
- 对于特定类做低侵入甚至无侵入的增强。比如对某个类的某个方法插入特定逻辑
所以,javaagent的主要功能其实类似aop,但是其原理是加载class文件之前做拦截,直接修改字节码,或者运行时动态修改字节码;而aop是生成一个新的代理类
如何编写javaagent
核心api:java.lang.instrument.Instrumentation
Instrumentation
其中一个优点就是能够让我们注册ClassFileTransformers。一个已注册的ClassFileTransformer
将拦截所有应用程序类的加载,并能够访问他们的字节码。同时,也可以修改类的字节码
入口是一个premain方法:
|
|
启动:java -javaagent:/path/to/agent.jar -jar app.jar