Java Agent是在Java 1.5版本之才有的东西,他可以构建一个独立Java服务外的一个代理程序,也就是Agent。通常会用它来做一下Java服务的监控,或者替换其他JVM上的程序,还可以实现虚拟机上的AOP功能。
Agent分为两种,一种是程序启动前触发的,一种是程序启动后触发的。
接下来我们来看看如何使用
首先我们创建一个Maven项目,同时在项目中编写好这个类。
public class TestAgent { public static void agentmain(String agentArgs, Instrumentation inst)throws Exception { // 注册一个 Transformer,该 Transformer在类加载时被调用 inst.addTransformer(new com.xxx.Transformer(), true); inst.retransformClasses(TestClass.class); System.out.println("premain done"); } public static void premain(String agentArgs) { System.out.println("this is a java agent only one args"); System.out.println("参数:" + agentArgs + "\n"); } }
如果agentmain存在重载的方法,将会忽略第二个方法,而执行第第一个带有Instrumentation方法。
在pom文件中添加
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.4</version> <configuration> <appendAssemblyId>false</appendAssemblyId> <!-- 将TestAgent的所有依赖包都打到jar包中--> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest><!-- 添加MANIFEST.MF中的各项配置--> <!-- 添加 mplementation-*和Specification-*配置项--> <addDefaultImplementationEntries>true </addDefaultImplementationEntries> <addDefaultSpecificationEntries>true </addDefaultSpecificationEntries> </manifest> <!-- 将 premain-class 配置项设置为com.xxx.TestAgent--> <manifestEntries> <Can-Retransform-Classes>true</Can-Retransform-Classes> <Agent-Class>com.xxx.TestAgent</Agent-Class> </manifestEntries> </archive> </configuration> <executions> <execution> <!-- 绑定到package生命周期阶段上 --> <phase>package</phase> <goals> <!-- 绑定到package生命周期阶段上 --> <goal>single</goal> </goals> </execution> </executions> </plugin>
然后执行打包命令
mvn package -Dcheckstyle.skip -DskipTests
打完包后会发现目录下会多一个target包
保存好teat-agent.jar的路径
新建一个main方法启动类
public class Main { public static void main(String[] args) { System.out.println(new TestClass().getNumber()); } }
在启动Main方法之前,配置好启动的参数
-javaagent:/Users/***/teat-agent.jar
启动之后就会发现,在Main方法之前他会先执行Agent包中编写好的agentmain方法内的东西。这样我们就达到了使用Agent的目的。