java agent的簡單使用

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包

 

新建一個項目代碼如下:

 

 

 

結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章