1、基本概念

Java Agent 是 jdk1.5 引入的特征,此特征为用户提供了在 jvm 将字节码文件读入内存后,jvm 使用对应的字节流在 java 堆中生成 Class 对象之前,用户可以对字节码进行修改的能力,从而 jvm 使用修改后的字节码创建 Class 对象。

目前只支持冷启动,热部署方式仍需官方持续改进。

流程图:
流程图

2、应用场景

Pinpoint分布式链路
SkyWalking分布式链路

3、实现步骤
  • 定义一个 resources/META-INF/MANIFEST.MF 文件,在其中添加 premain-class 配置项。
  • 创建 premain-class 配置项指定的类,并在其中实现 premain() 方法,方法签名如下:
public static void premain(String agentArgs, Instrumentation inst){
   ... 
}
  • 将 MANIFEST.MF 文件和 premain-class 指定的类一起打包成一个 jar 包。
  • 使用 -javaagent 指定该 jar 包的路径即可执行其中的 premain() 方法。
4、小案例

1)创建一个代理的jar
github: https://github.com/fomeiherz/agent-example
jar打包:mvn clean package
打包完成后,会在 {base}/target 下生成一个agent.jar ,一会启动会用到。

2)创建测试类
本地任意目录创建文件:App.java

public class App {
    public static void main(String[] args) {
        new App().test();
    }
    private void test() {
        System.out.println("hello agent.");
    }
}

把第1步打包的agent.jar拷贝到App.java文件目录下,然后编译启动。

编译:javac App.java
启动:java -javaagent:agent.jar App

【参考资料】
Java探针-Java Agent技术-阿里面试题

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐