JavaAgent

3968 ワード

-javaagentというJVMパラメータはJDK 5が導入したものです.
JAva-helpのヘルプには次のように書かれています.
-javaagent:<jarpath>[=<options>]
load Java programming language agent, see java.lang.instrument

JDKツールドキュメントには、詳細な説明はありません.
1. エージェント(agent)は、mainメソッドの前にあるインターセプタ、すなわちmainメソッドが実行される前にagentのコードを実行します.
Agentのコードはmainメソッドと同じJVMで実行され、同じsystem classloaderにロードされ、同じセキュリティポリシー(security policy)とコンテキスト(context)によって管理されます.
エージェント(agent)という名前は少し誤導的な成分で、私たちが一般的に理解しているエージェントとは違います.JAva agentは使いやすいです.
どのようにjava agentを書きますか?premainという方法を実現するだけで
public static void premain(String agentArgs, Instrumentation inst)

JDK 6で上記のpremainの定義が見つからない場合は、次の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. これらのエージェントのjarパッケージは、プログラムのclasspathに自動的に追加されます.手動でclasspathに追加する必要はありません.classpathの順序を指定しない限り.
4. 1つのjavaプログラムの-javaagentというパラメータの個数は制限されていないので、任意の複数のjava agentを追加できます.
すべてのjava agentはあなたが定義した順序で実行されます.例:
 java -javaagent:MyAgent1.jar -javaagent:MyAgent2.jar -jar MyProgram.jar

MyProgram.jarのmain関数がMyProgramにあるとします.
MyAgent1.jar, MyAgent2.jar,  この2つのjarパッケージでpremainを実現したクラスはそれぞれMyAgent 1であり,MyAgent 2プログラムが実行する順序は
MyAgent1.premain -> MyAgent2.premain -> MyProgram.main

5. またmain関数の後に置かれたpremainは実行されず、
たとえば
java -javaagent:MyAgent1.jar  -jar MyProgram.jar -javaagent:MyAgent2.jar

MyAgent 2もMyAgent 3もMyProgram.jarの後ろに置かれているので、MyAgent 2のpremainは実行されません.
だから実行の結果は
MyAgent1.premain -> MyProgram.main

6. 各java agentは、java optionで定義されたpremainのagentArgsという文字列タイプのパラメータを受信することができます.次のようになります.
java -javaagent:MyAgent2.jar=thisIsAgentArgs -jar MyProgram.jar

MyAgent 2でpremainが受信したagentArgsの値は「this IsAgentArgs」(二重引用符を除く)になります.
7. パラメータのInstrumentation:
パラメータのInstrumentation instで、自分で定義したClassFileTransformerを追加してclassファイルを変更します.
8. Java agentでは、既存のjavaプログラムコードを変更したり、agentの形式でプログラムを変更したり、強化したり、ホットスタートをしたりする必要はありません.
9. JDK 6にも追加されました
           所有者:
               Agentmainは、JVMが起動した後に呼び出されます.具体的にはJDKドキュメントの説明を見ることができます.具体的には私も使ったことがありません.この中の水はまだ深いので、使ったことがありません.コメントを発表しません.
私が書いた例はskydriveでダウンロード例をクリックにダウンロードできます.
参照先:
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?is-external=true
http://javahowto.blogspot.com/2006/07/javaagent-option.html