14

カスタム Java エージェントで jar ファイルをパックする場合、次のプロパティを追加できます。

  • Can-Redefine-Classes
  • Can-Retransform-Classes

これら2つの違いは何ですか?

クラスがロードされる前に再定義が行われ、その後に再変換が行われる場合、正確に再変換が行われるのはいつですか?

4

3 に答える 3

13

それらが提供する機能は、ほとんど冗長に見えます。主な違いは、クラスを再定義byte[]するとき、突然新しい定義を に提供するのに対し、 を再変換するとき、同じ API を介して現在の定義を含むを取得しbyte[]、変更された を返すことbyte[]です。

したがって、 を再定義するには、クラスについて詳しく知る必要があります。プロファイリング トレース ステートメントを挿入するユース ケースを考えてみましょう。retransformを使用すると、それをより直接的に行うことができます。指定されたバイトコードを見て、変更して、返すだけです。しかし、再定義byte[]ルートに行った場合、どこか ( など) からオリジナルを取得する必要がありgetResourceAsStream()ます。

もう 1 つの明らかな違いは、他のクラス トランスフォーマーとの対話方法にあります。誰が最初に行きます。変換は元のクラスまたは再定義されたクラスに適用されるため、たとえば、いくつかの変換を追加することができます。

歴史的に、 APIドキュメントのSinceコメント、またはこの本の238ページ(Friesen 2007 Beginning Java SE 6 Platform )を見ると、Java 5で再定義機能が導入され、Java 6で再変換機能が導入されたことに気づきます。より一般的な機能として再変換が導入されましたが、下位互換性のために再定義を保持する必要がありました。

上記のリンク先の本から、再変換方法に関する重要な文を引用します。

エージェントはこれらのメソッドを使用して、クラス ファイルにアクセスする必要なく、以前にロードされたクラスを再変換します。


質問の2番目の部分:

クラスがロードされる前に再定義が行われ、その後に再変換が行われる場合、正確に再変換が行われるのはいつですか?

いいえ、クラスがロードされた後に再定義と再変換が行われます。InstrumentationインスタンスredefineClasses(..)retransformClasses(..)メソッドをそれぞれ呼び出すと発生します。

通りすがりの専門家に質問です。クラスを再定義することでできること、クラスを再変換することではできないことはありますか? 私の推測では、答えは「何もない」です。

于 2016-08-27T05:13:54.270 に答える
8

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

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

于 2014-04-04T08:51:00.693 に答える