【轉(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