什么是Java Agent
Java Agent是在Java 1.5版本之才有的東西,他可以構建一個獨立Java服務外的一個代理程序,也就是Agent。通常會用它來做一下Java服務的監控,或者替換其他JVM上的程序,還可以實現虛擬機上的AOP功能。
Agent分為兩種,一種是程序啟動前觸發的,一種是程序啟動后觸發的。
編寫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方法。
通過maven將Agent打包
在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
使用agent包
打完包后會發現目錄下會多一個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的目的。