4

Java バイトコード変更のチュートリアルを楽しんでいます。Can-Redefine-Classes: true Can-Retransform-Classes: true Can-Set-Native-Method-Prefix: true それはまったく問題ありませんが、どのチュートリアルも説明していません属性は正確に何をしますか。オラクルのドキュメントはかなり簡潔ですが、Can-Set-Native-Method-Prefix: true を除いて、Java メソッドとして単純に変更することはできないため、ネイティブ メソッドも計測できると思います...

クラスの再定義と再変換の違いは何ですか?

4

1 に答える 1

4

まず、これらの属性は一般的なバイトコード操作には必要ありません。これらは、JVMの計測機能を使用して Java エージェントの特別な機能を要求するために存在します。たとえば、バイトコードをアセンブルして新しいクラスを作成すると、それらがなくても機能します。

再定義とは、エージェントが任意の時点でInstrumentation. redefineClasses、既存の (および既にロードされている) クラスの実際の定義を変更するために呼び出すことを意味します。エージェントは、新しい定義のバイトコードを提供します。

再変換とは、クラスのロード時に通常適用されるクラス ファイルの変換プロセスを指します。エージェントは、クラスが初期化される前にバイトコードに変換を適用するために次々に呼び出される を登録できClassFileTransformerます。したがって、再変換とは、すでにロードされているクラスに対してこのプロセスを繰り返す JVM の機能を指します。この場合、エージェントはInstrumentation.retransformClasses再変換するクラスを指定して呼び出しますが、バイトコードは指定しません。ClassFileTransformer代わりに、JVM は、実際のバイトコード (または連鎖トランスフォーマーの前のトランスフォーマーの結果) を提供するすべての登録済みの再変換可能な を呼び出します。

ネイティブ メソッド プレフィックスの設定はさらに特別です。ネイティブ メソッドをインストルメント化するときに役立つ場合があります。

おわかりのように、バイトコードをいじっているときに、これらすべての機能が常に必要になることはまずありません。

于 2013-11-19T11:26:29.073 に答える