java的premain

##特性 在類的字節碼載入JVM前會調用ClassFileTransformer的transform方法,從而實現修改原類方法的功能。 ##原理 JVMTI(Java Virtual Machine Tool Interface)是一套本地編程接口集合,它提供了一套『代理』機制,能夠支持第三方工具程序以代理的方式鏈接和訪問 JVM,並利用 JVMTI 提供的豐富的編程接口,完成不少跟 JVM 相關的功能。java

java.lang.instrument 包的實現,也就是基於這種機制的:在 Instrumentation 的實現當中,存在一個 JVMTI 的代理程序,經過調用 JVMTI 當中 Java 類相關的函數來完成 Java 類的動態操做。編程

Instrumentation 的最大做用就是類定義的動態改變和操做。在 Java SE 5 及其後續版本當中,開發者能夠在一個普通 Java 程序(帶有 main 函數的 Java 類)運行時,經過 – javaagent 參數指定一個特定的 jar 文件(包含 Instrumentation 代理)來啓動 Instrumentation 的代理程序。函數

##要素 ###Premain-Class 打成jar包,在jar包裏面的 META-INF/MAINIFEST.MF 必須包含 Premain-Class這個屬性。 若是 JVM 啓動時指定了代理,那麼此屬性是必需的,即包含 premain 方法的類。若是該屬性不存在,那麼 JVM 將停止。 ###Agent-Class 若是實現支持 VM 啓動以後某一時刻啓動代理的機制,那麼此屬性指定代理類。 即包含 agentmain 方法的類。 ###Boot-Class-Path 設置引導類加載器搜索的路徑列表。路徑表示目錄或庫(在許多平臺上一般做爲 JAR 或 zip 庫被引用)。 ###Can-Redefine-Classes 布爾值(true 或 false,與大小寫無關)。是否能重定義此代理所需的類。true 之外的值均被視爲 false。此屬性是可選的,默認值爲 false。 ###Can-Retransform-Classes 布爾值(true 或 false,與大小寫無關)。是否能重轉換此代理所需的類。true 之外的值均被視爲 false。此屬性是可選的,默認值爲 false。 ###Can-Set-Native-Method-Prefix 布爾值(true 或 false,與大小寫無關)。是否能設置此代理所需的本機方法前綴。true 之外的值均被視爲 false。此屬性是可選的,默認值爲 false。 ##實例工具

import java.lang.instrument.Instrumentation;  
  
public class MyAgent {  
    public static void premain(String agentOps, Instrumentation inst){  
        System.out.println(agentOps);  
    }  
}

運行.net

java -javaagent:myagent.jar=youragrs -jar demo.jar

##docs代理

相關文章
相關標籤/搜索