【Agent】Java Agent 介紹與使用
什么是Java Agent
Java Agent是在Java 1.5版本之才有的東西,他可以構(gòu)建一個(gè)獨(dú)立Java服務(wù)外的一個(gè)代理程序,也就是Agent。通常會(huì)用它來(lái)做一下Java服務(wù)的監(jiān)控,或者替換其他JVM上的程序,還可以實(shí)現(xiàn)虛擬機(jī)上的AOP功能。
Agent分為兩種,一種是程序啟動(dòng)前觸發(fā)的,一種是程序啟動(dòng)后觸發(fā)的。
編寫Agent
接下來(lái)我們來(lái)看看如何使用
首先我們創(chuàng)建一個(gè)Maven項(xiàng)目,同時(shí)在項(xiàng)目中編寫好這個(gè)類。
public class TestAgent {
public static void agentmain(String agentArgs,
Instrumentation inst)throws Exception {
// 注冊(cè)一個(gè) Transformer,該 Transformer在類加載時(shí)被調(diào)用
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("參數(shù):" + agentArgs + "\n");
}
}
如果agentmain存在重載的方法,將會(huì)忽略第二個(gè)方法,而執(zhí)行第第一個(gè)帶有Instrumentation方法。
通過(guò)maven將Agent打包
在pom文件中添加
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<!-- 將TestAgent的所有依賴包都打到j(luò)ar包中-->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest><!-- 添加MANIFEST.MF中的各項(xiàng)配置-->
<!-- 添加 mplementation-*和Specification-*配置項(xiàng)-->
<addDefaultImplementationEntries>true
</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true
</addDefaultSpecificationEntries>
</manifest>
<!-- 將 premain-class 配置項(xiàng)設(shè)置為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>
然后執(zhí)行打包命令
mvn package -Dcheckstyle.skip -DskipTests
使用agent包
打完包后會(huì)發(fā)現(xiàn)目錄下會(huì)多一個(gè)target包

保存好teat-agent.jar的路徑
新建一個(gè)main方法啟動(dòng)類
public class Main {
public static void main(String[] args) {
System.out.println(new TestClass().getNumber());
}
}
在啟動(dòng)Main方法之前,配置好啟動(dòng)的參數(shù)
-javaagent:/Users/***/teat-agent.jar
啟動(dòng)之后就會(huì)發(fā)現(xiàn),在Main方法之前他會(huì)先執(zhí)行Agent包中編寫好的agentmain方法內(nèi)的東西。這樣我們就達(dá)到了使用Agent的目的。

浙公網(wǎng)安備 33010602011771號(hào)