聲明:原創(chuàng)文章,轉(zhuǎn)載請注明出處。http://www.itdecent.cn/p/3bbfa22ec7f5
Java字節(jié)碼系列
Java字節(jié)碼1-Agent簡單上手
Java字節(jié)碼2-instrument初體驗
Java字節(jié)碼3-使用ByteBuddy實現(xiàn)一個Java-Agent
Java字節(jié)碼4-使用Java-Agent實現(xiàn)一個JVM監(jiān)控工具
本系列代碼可見:https://github.com/hawkingfoo/demo-agent
一、概述
Java Agent是從JDK1.5及以后引入的,其作用相當(dāng)于你的main函數(shù)之前的一個攔截器,即在執(zhí)行main函數(shù)前,先執(zhí)行Agent中的代碼。
Agent的代碼與你的main方法在同一個JVM中運行,并被同一個類加載器所加載,被同一的安全策略 和上下文所管理。
二、簡單上手寫一個Agent
1、編寫一個Java類,并包含如下兩個方法中的任一個:
public static void premain(String agentArgs, Instrumentation inst); //【1】
public static void premain(String agentArgs); //【2】
其中,【1】和【2】同時存在時,【1】會優(yōu)先被執(zhí)行,而【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、jar打包
首先,需要在代碼的resources目錄下添加META-INF/MANIFEST.MF文件。其目的是指定Premain-Class的類。
Manifest-Version: 1.0
Premain-Class: agent.MyAgent
Can-Redefine-Classes: true
其次,在pom.xml中配置打包的相關(guān)配置。
<packaging>jar</packaging>
<build>
<finalName>my-agent</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<archive>
<index>true</index>
<manifestFile>
src/main/resources/META-INF/MANIFEST.MF
</manifestFile>
<manifest>
<addDefaultImplementationEntries/>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
最后,執(zhí)行mvn clean package,就能生成一個my-agent.jar。
3、Agent運行
使用如下設(shè)置運行Agent。
-javaagent: 文件位置 [=參數(shù)]
備注:如果是運行多個agent,進(jìn)行羅列即可。-javaagent: 文件位置 [=參數(shù)] -javaagent: 文件位置 [=參數(shù)],其中的參數(shù)就是premain函數(shù)中的agentArgs。
三、Agent使用
首先,新建一個測試類。如下:
public class AgentTest {
public static void main(String[] args) {
System.out.println("this is main");
}
}
命令行運行:java -javaagent: 文件位置 [=參數(shù)]
idea運行:如果是Idea中,按如下配置。

運行結(jié)果如下:我這里重復(fù)加載了兩次Agent,但是傳入的參數(shù)不同。
this is an agent.
args:first
this is an agent.
args:second
this is main