package com.meng.apm.javaagent.simple;
import java.lang.instrument.Instrumentation;
/**
* jdk1.5以後引入了javaAgent技術,javaAgent是運行方法之前的攔截器。
* 我們利用javaAgent和ASM字節碼技術,在JVM加載class二進制文件的時候,利用ASM動態的修改加載的class文件
*
* 如果你把 -javaagent 放在 -jar 後面,則不會生效。也就是說,放在主程序後面的 agent 是無效的。
*
*
* 測試
* -javaagent:E:\workspace\netty\out\artifacts\nettyagent_jar\netty.jar=Hello -javaagent:E:\workspace\netty\out\artifacts\nettyagent_jar\netty.jar=World
*/
public class TestAgent {
/**
* 該方法在main方法之前運行,與main方法運行在同一個JVM中
* 並被同一個System ClassLoader裝載
* 被統一的安全策略(security policy)和上下文(context)管理
*
* 在這個 premain 函數中,開發者可以進行對類的各種操作。
* 1、agentArgs 是 premain 函數得到的程序參數,隨同 “– javaagent”一起傳入。與 main 函數不同的是,
* 這個參數是一個字符串而不是一個字符串數組,如果程序參數有多個,程序將自行解析這個字符串。
* 2、Inst 是一個 java.lang.instrument.Instrumentation 的實例,由 JVM 自動傳入。*
* java.lang.instrument.Instrumentation 是 instrument 包中定義的一個接口,也是這個包的核心部分,
* 集中了其中幾乎所有的功能方法,例如類定義的轉換和操作等等。
* @param agentArgs
* @param inst
*/
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("=========premain方法執行1========");
System.out.println(agentArgs);
}
/**
* 如果不存在 premain(String agentArgs, Instrumentation inst)
* 則會執行 premain(String agentArgs)
* @param agentArgs
*/
public static void premain(String agentArgs) {
System.out.println("=========premain方法執行2========");
System.out.println(agentArgs);
}
}
打包jar
編譯jar包 build artifacts
生成jar包
新建一個項目代碼如下:
結果: