Java agent
1、Java agent是什么
Java agent是java命令的一个参数。参数javaagent可以用于指定一个jar包。
- 这个jar包的MAINFEST.MF文件必须指定Premain-Class项。
- Premain-Class指定的那个类必须实现premain()方法。
当Java虚拟机启动时,在执行main函数之前,JVM会先运行-javaagent所指定jar包内Premain-Class这个类的premain方法。
2、如何使用Java agent
2.1、步骤
使用java agent 需要几个步骤:
- 定义一个MANIFEST.MF文件,必须包含Premain-Class选项,通常也会加入Can-Redefi
ne-Classes和Can-Retransform-Classes选项。 - 创建一个Premain-Class指定的类,类中包含premain方法,方法逻辑由户自己确定。
- 将premain的类和MANIFEST.MF文件打成jar包。
- 使用参数-javaagent: jar包路径启动要代理的方法。
2.2、premain()方法的参数
premain()方法包括两个参数:
- String agentArgs这个参数就是agent接收到的参数
- Instrumentation inst 这个参数能操作一些类的方法,提供了一些类转化的方法
public static void premain(String agentArgs, Instrumentation inst); //【1】
public static void premain(String agentArgs); //【2】
其中,【1】和【2】同时存在时,【1】会优先被执行,而【2】则会被忽略。
具体使用如下代码:
import java.lang.instrument.Instrumentation;
public class MyAgent {
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("this is an agent.");
System.out.println("args:" + agentArgs + "\n");
}
}
2.3、MANIFEST.MF文件
首先,需要在代码的resources目录下添加META-INF/MANIFEST.MF文件。其目的是指定Premain-Class的类。
Manifest-Version: 1.0
Premain-Class: agent.MyAgent
Can-Redefine-Classes: true
2.4、pom.xml文件中配置打包的相关配置
pom.xml文件中添加打包插件和打包的相关配置,指定Premain-Class:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</ma