聲明:原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處亿胸。http://www.reibang.com/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)控工具
本系列代碼可見(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)單上手寫(xiě)一個(gè)Agent
1按厘、編寫(xiě)一個(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