如何把Java代碼玩出花?JVM Sandbox入門教程與原理淺談( 四 )

Instrumentation的局限性:

  • 不能通過字節碼文件和自定義的類名重新定義一個本來不存在的類
  • 增強類和老類必須遵循很多限制:比如新類和老類的父類必須相同;新類和老類實現的接口數也要相同,并且是相同的接口;新類和老類訪問符必須一致 。新類和老類字段數和字段名要一致;新類和老類新增或刪除的方法必須是private static/final修飾的;
更詳細的原理闡述可以看下文:
https://www.cnblogs.com/rickiyang/p/11368932.html
再談Attach和Agent上面的實戰章節中已經提到了attach和agent兩者的區別 , 這里再展開聊聊 。
在Instrumentation中,Agent模式是通過-javaagent:<jarpath>[=<選項>]從應用啟動時候就插樁,隨著應用一起啟動 。它要求指定的類中必須要有premain()方法,并且對premain方法的簽名也有要求,簽名必須滿足以下兩種格式:
public static void premain(String agentArgs, Instrumentation inst)public static void premain(String agentArgs)一個java程序中-javaagent參數的個數是沒有限制的,所以可以添加任意多個javaagent 。所有的java agent會按照你定義的順序執行,例如:
java -javaagent:agent1.jar -javaagent:agent2.jar -jar MyProgram.jar上面介紹Agent模式的Instrumentation是在 JDK 1.5中提供的 , 在1.6中,提供了attach方式的Instrumentation,你需要的是agentmain方法,并且簽名如下:
public static void agentmain (String agentArgs, Instrumentation inst)public static void agentmain (String agentArgs)這兩種方式各有不同用途 , 一般來說,Attach方式適合于動態的對代碼進行功能修改,在排查問題的時候用的比較多 。而Agent模式隨著應用啟動 , 所以經常用于提前實現一些增強功能,比如我上面實戰中的啟動觀測,應用防火墻 , 限流策略等等 。
總結本文花了較短的篇幅重點介紹了JVM Sandbox的功能,實際用法 , 以及基礎原理 。它通過封裝一些底層JVM控制的框架,使得對JVM層面的AOP開發變的異常簡單 , 就像作者自己所說“

推薦閱讀