2

メソッドClassFileTransformer.transform(ClassLoader classLoader、String className、Class classBeingRedefined、ProtectionDomain protectedDomain、byte [] classfileBuffer)のJ2SE 5.0仕様は、次のように指示します。

トランスフォーマーは、すべての新しいクラス定義とすべてのクラス再定義に対して呼び出されます。新しいクラス定義の要求は、ClassLoader.defineClassを使用して行われます。クラスの再定義の要求は、Instrumentation.redefineClassesまたはそのネイティブの同等物を使用して行われます。トランスフォーマーは、要求の処理中に、クラスファイルのバイトが検証または適用される前に呼び出されます。

この情報を使用すると、同じランタイムクラス(classLoader&className)に対してメソッドClassFileTransformer.transformを同時に呼び出すことが可能かどうかはわかりません。メソッドInstrumentation.redefineClassesを同じクラスに対して同時に呼び出すことができることは理解していますが、これは、そのような呼び出しが同じクラスに対してClassFileTransformer.transformの同時呼び出しにつながる可能性があることを意味するものではありません。私の理解を明確にする方法はありますか?

私の場合、変換にJavassistを使用しており、同時に実行されているメソッドClassFileTransformer.transformからCtClassの同じインスタンスを使用できるため、これは重要です。現在、念のため、synchronized(ctClass)ブロック内のCtClassインスタンスですべての作業を行っています。

4

1 に答える 1

0

同じクラスに対してメソッドを同時に呼び出そうとしInstrumentation.redefineClasses、クラスファイルトランスフォーマーtransformメソッドが同時に呼び出されたかどうかを確認しました。そして答えはイエスです。ClassFileTransformer.transformメソッドは同じクラスのJVMによって同時に呼び出すことができます。

于 2012-10-17T02:22:28.840 に答える