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

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

idea配置.png

運(yùn)行結(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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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

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