linugb118--java space

          Java

          【轉(zhuǎn)】javaAgent 參數(shù)

          -javaagent 這個JVM參數(shù)是JDK 5引進(jìn)的.

          java -help的幫助里面寫道:

          -javaagent:<jarpath>[=<options>]
          load Java programming language agent, see java.lang.instrument

          JDK 工具文檔里面,并沒有很詳細(xì)的說明。

          1. 代理 (agent) 是在你的main方法前的一個攔截器 (interceptor),也就是在main方法執(zhí)行之前,執(zhí)行agent的代碼。

          agent的代碼與你的main方法在同一個JVM中運(yùn)行,并被同一個system classloader裝載,被同一的安全策略 (security policy) 和上下文 (context) 所管理。

          叫代理(agent)這個名字有點(diǎn)誤導(dǎo)的成分,它與我們一般理解的代理不大一樣。java agent使用起來比較簡單。

          怎樣寫一個java agent? 只需要實(shí)現(xiàn)premain這個方法

          public static void premain(String agentArgs, Instrumentation inst)

          JDK 6 中如果找不到上面的這種premain的定義,還會嘗試調(diào)用下面的這種premain定義:

          public static void premain(String agentArgs)

          2. Agent 類必須打成jar包,然后里面的 META-INF/MAINIFEST.MF 必須包含 Premain-Class這個屬性。

          下面是一個MANIFEST.MF的例子:

          Manifest-Version: 1.0
          Premain-Class:MyAgent1
          Created-By:1.6.0_06

          然后把MANIFEST.MF 加入到你的jar包中。

          3. 所有的這些Agent的jar包,都會自動加入到程序的classpath中。所以不需要手動把他們添加到classpath。
          除非你想指定classpath的順序。

          4. 一個java程序中-javaagent這個參數(shù)的個數(shù)是沒有限制的,所以可以添加任意多個java agent。

          所有的java agent會按照你定義的順序執(zhí)行。
          例如:

           java -javaagent:MyAgent1.jar -javaagent:MyAgent2.jar -jar MyProgram.jar

          假設(shè)MyProgram.jar里面的main函數(shù)在MyProgram中。

          MyAgent1.jar, MyAgent2.jar,  這2個jar包中實(shí)現(xiàn)了premain的類分別是MyAgent1, MyAgent2
          程序執(zhí)行的順序?qū)?/p>

          MyAgent1.premain -> MyAgent2.premain -> MyProgram.main

          5. 另外,放在main函數(shù)之后的premain是不會被執(zhí)行的

          例如

          java -javaagent:MyAgent1.jar  -jar MyProgram.jar -javaagent:MyAgent2.jar

          MyAgent2 和MyAgent3 都放在了MyProgram.jar后面,所以MyAgent2的premain都不會被執(zhí)行,

          所以執(zhí)行的結(jié)果將是

          MyAgent1.premain -> MyProgram.main

          6. 每一個java agent 都可以接收一個字符串類型的參數(shù),也就是premain中的agentArgs,這個agentArgs是通過java option中定義的。
          如:

          java -javaagent:MyAgent2.jar=thisIsAgentArgs -jar MyProgram.jar

          MyAgent2中premain接收到的agentArgs的值將是”thisIsAgentArgs” (不包括雙引號)

          7. 參數(shù)中的Instrumentation:

          通過參數(shù)中的Instrumentation inst,添加自己定義的ClassFileTransformer,來改變class文件。

          8. 通過java agent就可以不用修改原有的java程序代碼,通過agent的形式來修改或者增強(qiáng)程序了,或者做熱啟動等等。

          9. JDK 6 中還增加了agentmain,agentmain可以在JVM運(yùn)行過程中做一些事情,這個遲點(diǎn)再研究一下。

          上面我寫的例子可以在我的skydrive上面下載到:點(diǎn)擊下載例子

          參考:

          http://download-llnw.oracle.com/javase/1.5.0/docs/api/java/lang/instrument/package-summary.html

          http://download.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html

          http://javahowto.blogspot.com/2006/07/javaagent-option.html

          posted on 2011-03-02 14:09 linugb118 閱讀(1280) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          My Links

          Blog Stats

          常用鏈接

          留言簿(1)

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 仙桃市| 张掖市| 拉萨市| 兴国县| 浙江省| 乌鲁木齐市| 武安市| 循化| 呼伦贝尔市| 建昌县| 莲花县| 余姚市| 二手房| 沾益县| 洪洞县| 伊宁市| 万安县| 麟游县| 左权县| 沾益县| 婺源县| 富源县| 朔州市| 万年县| 平顶山市| 吉木萨尔县| 兰西县| 潜江市| 八宿县| 伊吾县| 邢台市| 顺平县| 武乡县| 伊春市| 兴城市| 阿克| 普定县| 韶山市| 诏安县| 黎城县| 察哈|