6

メソッドを使用してクラスを作成し、premainそのメソッド内ClassFileTransformerInstrumentationInstrumentation.addTransformer())を追加しました。

を使用してアプリケーションを呼び出しました

java -javaagent:<path_to_agnet.jar> <application>

ただしClassFileTransformer.transform()、メソッドは呼び出されていません。私はそれが呼び出されているの
を観察しました。また、を呼び出すと、が呼び出さ れていることも確認しました。 最初の定義()では、メソッドは呼び出されていません。premain
Instrumentation.retransformClasses()ClassFileTransformer.transform()
Classloader.defineClass()transform()

何が間違っているのか手がかりはありますか?

注:それが助けになるなら、私はソースコードを投稿することができます。

よろしく、Rejeev。

4

1 に答える 1

4

考えられる原因

.

不適切なマニフェスト

Instrumentation クラスを定義するために必要なすべての手順を実行しましたか?

特に「パッケージ化」ステップでは、JAR のマニフェストでわずかに異なる属性セットを指定する必要があります。

  • の代わりに、エージェントに実装するクラスの完全なクラス名を与える属性をMain-Class指定する必要があります。Premain-Classpremain()
Premain-Class: my.package.MyAgentClass
  • エージェントがクラス ライブラリを使用する場合は、Boot-Class-Path属性を指定する必要があります。インストルメンテーション エージェントでは、そのライブラリがブートストラップ クラスローダーから見えるようにする必要があるためです。
    これを行わないと、おそらく-Xbootclasspath/a:...JVM に対して奇抜な引数を使用する必要があります。
    コマンドライン引数は物事を進める上で適切な方法ですが、長期的にはこの属性を使用する必要があります。これは、コマンドラインが Java インストルメンテーション エージェントを指定する必要からすでに大きくなっているからです。できるだけシンプルに保つこともできます。

  • 最後にCan-Redefine-Classes属性です。
    true に設定されている場合、Java 計測エージェントは、エージェント自体が使用するクラスを再定義できます。
    これはかなり奇妙な状況であり、確かにあまり発生しません。

.

サイレント例外

( Rejeev Divakaranがそれを手に入れました)。

classBeingRedefined.getName()クラス名を印刷するために使用していました。初回ロード時
classBeingRedefinedですnull

一番下の行は、変換メソッドでキャッチされていない例外がある場合です。黙々と食べ尽くさ
れる。

于 2009-04-08T10:34:53.567 に答える