聲明:原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處。http://www.itdecent.cn/p/3bbfa22ec7f5
Java字節(jié)碼系列
Java字節(jié)碼1-Agent簡(jiǎn)單上手
Java字節(jié)碼2-instrument初體驗(yàn)
Java字節(jié)碼3-使用ByteBuddy實(shí)現(xiàn)一個(gè)Java-Agent
Java字節(jié)碼4-使用Java-Agent實(shí)現(xiàn)一個(gè)JVM監(jiān)控工具
本系列代碼可見:https://github.com/hawkingfoo/demo-agent
一、概述
Java Agent是從JDK1.5及以后引入的,其作用相當(dāng)于你的main函數(shù)之前的一個(gè)攔截器,即在執(zhí)行main函數(shù)前,先執(zhí)行Agent中的代碼。
Agent的代碼與你的main方法在同一個(gè)JVM中運(yùn)行,并被同一個(gè)類加載器所加載,被同一的安全策略 和上下文所管理。
二、簡(jiǎn)單上手寫一個(gè)Agent
1、編寫一個(gè)Java類,并包含如下兩個(gè)方法中的任一個(gè):
public static void premain(String agentArgs, Instrumentation inst); //【1】
public static void premain(String agentArgs); //【2】
其中,【1】和【2】同時(shí)存在時(shí),【1】會(huì)優(yōu)先被執(zhí)行,而【2】則會(huì)被忽略。
具體使用如下代碼:
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,就能生成一個(gè)my-agent.jar。
3、Agent運(yùn)行
使用如下設(shè)置運(yùn)行Agent。
-javaagent: 文件位置 [=參數(shù)]
備注:如果是運(yùn)行多個(gè)agent,進(jìn)行羅列即可。-javaagent: 文件位置 [=參數(shù)] -javaagent: 文件位置 [=參數(shù)],其中的參數(shù)就是premain函數(shù)中的agentArgs。
三、Agent使用
首先,新建一個(gè)測(cè)試類。如下:
public class AgentTest {
public static void main(String[] args) {
System.out.println("this is main");
}
}
命令行運(yùn)行:java -javaagent: 文件位置 [=參數(shù)]
idea運(yùn)行:如果是Idea中,按如下配置。

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