Java字節(jié)碼1-Agent簡單上手

聲明:原創(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中,按如下配置。

idea配置.png

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

this is an agent.
args:first

this is an agent.
args:second

this is main
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • title: Android AOP之字節(jié)碼插樁author: 陶超description: 實現(xiàn)數(shù)據(jù)收集SDK時...
    陶菜菜閱讀 38,663評論 40 182
  • 盒子是安卓系統(tǒng),并且盒子留下了USB接口。盒子本身的應(yīng)用商店應(yīng)用非常少,根本不能滿足需求,所以需要安裝第三方的TV...
    ckyyouknow閱讀 594評論 3 5
  • “抽根煙?”吳一舉著煙示意劉國生。 “不了,戒了。你今天怎么有時間過來看我?” “下雨嘛,不上班就想著來看看你?!?..
    吳云溪閱讀 209評論 0 1

友情鏈接更多精彩內(nèi)容