【Agent】Java Agent 介紹與使用


什么是Java Agent

Java Agent是在Java 1.5版本之才有的東西,他可以構建一個獨立Java服務外的一個代理程序,也就是Agent。通常會用它來做一下Java服務的監控,或者替換其他JVM上的程序,還可以實現虛擬機上的AOP功能。

Agent分為兩種,一種是程序啟動前觸發的,一種是程序啟動后觸發的。

編寫Agent

接下來我們來看看如何使用
首先我們創建一個Maven項目,同時在項目中編寫好這個類。

public class TestAgent {
    public static void agentmain(String agentArgs,
                               Instrumentation inst)throws Exception {
        // 注冊一個 Transformer,該 Transformer在類加載時被調用
        inst.addTransformer(new com.xxx.Transformer(), true);
        inst.retransformClasses(TestClass.class);
        System.out.println("premain done");
    }

    public static void premain(String agentArgs) {
        System.out.println("this is a java agent only one args");
        System.out.println("參數:" + agentArgs + "\n");
    }
}

如果agentmain存在重載的方法,將會忽略第二個方法,而執行第第一個帶有Instrumentation方法。

通過maven將Agent打包

在pom文件中添加

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <!-- 將TestAgent的所有依賴包都打到jar包中-->
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest><!-- 添加MANIFEST.MF中的各項配置-->
                            <!-- 添加 mplementation-*和Specification-*配置項-->
                            <addDefaultImplementationEntries>true
                            </addDefaultImplementationEntries>
                            <addDefaultSpecificationEntries>true
                            </addDefaultSpecificationEntries>
                        </manifest>
                        <!-- 將 premain-class 配置項設置為com.xxx.TestAgent-->
                        <manifestEntries>
                            <Can-Retransform-Classes>true</Can-Retransform-Classes>
                            <Agent-Class>com.xxx.TestAgent</Agent-Class>
                        </manifestEntries>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <!-- 綁定到package生命周期階段上 -->
                        <phase>package</phase>
                        <goals>
                            <!-- 綁定到package生命周期階段上 -->
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
</plugin>

然后執行打包命令

mvn package -Dcheckstyle.skip -DskipTests

使用agent包

打完包后會發現目錄下會多一個target包

image.png

保存好teat-agent.jar的路徑

新建一個main方法啟動類

public class Main {
    public static void main(String[] args) {
        System.out.println(new TestClass().getNumber());
    }
}

在啟動Main方法之前,配置好啟動的參數

-javaagent:/Users/***/teat-agent.jar

啟動之后就會發現,在Main方法之前他會先執行Agent包中編寫好的agentmain方法內的東西。這樣我們就達到了使用Agent的目的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM