クラス Enhancer

実装されたすべてのインターフェース:
ClassGenerator

public class Enhancer extends AbstractClassGenerator
メソッドのインターセプトを有効にする動的サブクラスを生成します。このクラスは、JDK 1.3 に含まれている標準の動的プロキシサポートの代わりとして開始されましたが、インターフェースの実装に加えて、プロキシが具体的な基本クラスを継承できるようにしました。動的に生成されたサブクラスは、スーパークラスの非最終メソッドをオーバーライドし、ユーザー定義のインターセプター実装にコールバックするフックを持っています。

元の最も一般的なコールバック型は MethodInterceptor です。これは、AOP 用語で「アラウンドアドバイス」を有効にします。--that は、「スーパー」メソッドの呼び出しの前後の両方でカスタムコードを呼び出すことができます。さらに、スーパーメソッドを呼び出す前に引数を変更することも、まったく呼び出さないようにすることもできます。

MethodInterceptor は、あらゆるインターセプトのニーズを満たすのに十分な汎用性を備えていますが、多くの場合、やり過ぎです。シンプルさとパフォーマンスのために、LazyLoader などの追加の特殊なコールバック型も利用できます。多くの場合、拡張クラスごとに 1 つのコールバックが使用されますが、どのコールバックを使用するかは CallbackFilter を使用してメソッドごとに制御できます。

このクラスの最も一般的な使用箇所は、静的ヘルパーメソッドで具体化されます。使用する ClassLoader のカスタマイズなどの高度なニーズについては、Enhancer の新しいインスタンスを作成する必要があります。CGLIB 内の他のクラスも同様のパターンに従います。

setUseFactory(boolean) を使用してこの機能を明示的に無効にしない限り、すべての拡張オブジェクトは Factory インターフェースを実装します。Factory インターフェースは、既存のオブジェクトのコールバックを変更するための API を提供するだけでなく、同じ型の新しいインスタンスをより迅速かつ簡単に作成する方法も提供します。

java.lang.reflect.Proxy のほぼ完全な置き換えについては、Proxy クラスを参照してください。

  • コンストラクターの詳細

    • Enhancer

      public Enhancer()
      新しい Enhancer を作成します。生成されたオブジェクトごとに新しい Enhancer オブジェクトを使用する必要があり、スレッド間で共有しないでください。生成されたクラスの追加インスタンスを作成するには、Factory インターフェースを使用します。
      関連事項:
  • メソッドの詳細

    • setSuperclass

      public void setSuperclass(ClassSE superclass)
      生成されたクラスが拡張するクラスを設定します。便宜上、提供されたスーパークラスが実際にインターフェースである場合、代わりに適切な引数を使用して setInterfaces が呼び出されます。非インターフェース引数は final として宣言してはならず、アクセス可能なコンストラクターを持っている必要があります。
      パラメーター:
      superclass - 拡張するクラスまたは実装するインターフェース
      関連事項:
    • setInterfaces

      public void setInterfaces(ClassSE[] interfaces)
      実装するインターフェースを設定します。Factory インターフェースは、ここで指定されている内容に関係なく、常に実装されます。
      パラメーター:
      interfaces - 実装するインターフェースの配列、または null
      関連事項:
    • setCallbackFilter

      public void setCallbackFilter(CallbackFilter filter)
      生成されたクラスのメソッドを特定のコールバックインデックスにマップするために使用される CallbackFilter を設定します。新しいオブジェクトインスタンスは常に同じマッピングを使用しますが、異なる実際のコールバックオブジェクトを使用する場合があります。
      パラメーター:
      filter - 新しいクラスを生成するときに使用するコールバックフィルター
      関連事項:
    • setCallback

      public void setCallback(Callback callback)
      シングル Callback を使用するように設定します。createClass() を使用する場合は無視されます。
      パラメーター:
      callback - すべてのメソッドに使用するコールバック
      関連事項:
    • setCallbacks

      public void setCallbacks(Callback[] callbacks)
      使用するコールバックの配列を設定します。createClass() を使用する場合は無視されます。CallbackFilter を使用して、プロキシされたクラスの各メソッドのこの配列にインデックスを指定する必要があります。
      パラメーター:
      callbacks - コールバック配列
      関連事項:
    • setUseFactory

      public void setUseFactory(boolean useFactory)
      拡張オブジェクトインスタンスが Factory インターフェースを実装するかどうかを設定します。これは、プロキシがターゲットとより見分けがつかないようにする必要があるツールのために追加されました。また、場合によっては、コードが基になるコールバックを変更するのを防ぐために、Factory インターフェースを無効にする必要があります。
      パラメーター:
      useFactory - Factory を実装するかどうか ; デフォルトは true です
    • setInterceptDuringConstruction

      public void setInterceptDuringConstruction(boolean interceptDuringConstruction)
      プロキシのコンストラクター内から呼び出されたメソッドをインターセプトするかどうかを設定します。デフォルト値は true です。インターセプトされていないメソッドは、プロキシの基本クラスのメソッドが存在する場合、それを呼び出します。
      パラメーター:
      interceptDuringConstruction - コンストラクターから呼び出されたメソッドをインターセプトするかどうか
    • setCallbackType

      public void setCallbackType(ClassSE callbackType)
      使用する Callback のシングル型を設定します。これは、実際のコールバックインスタンスの配列を持つことができない場合があるため、createClass() を呼び出すときに setCallback(org.springframework.cglib.proxy.Callback) の代わりに使用できます。
      パラメーター:
      callbackType - すべてのメソッドに使用するコールバックの型
      関連事項:
    • setCallbackTypes

      public void setCallbackTypes(ClassSE[] callbackTypes)
      使用するコールバック型の配列を設定します。これは、実際のコールバックインスタンスの配列を持つことができないため、createClass() を呼び出すときに setCallbacks(org.springframework.cglib.proxy.Callback[]) の代わりに使用できます。CallbackFilter を使用して、プロキシされたクラスの各メソッドのこの配列にインデックスを指定する必要があります。
      パラメーター:
      callbackTypes - コールバック型の配列
    • create

      public ObjectSE create()
      必要に応じて新しいクラスを生成し、指定されたコールバック(存在する場合)を使用して新しいオブジェクトインスタンスを作成します。スーパークラスの引数なしのコンストラクターを使用します。
      戻り値:
      新しいインスタンス
    • create

      public ObjectSE create(ClassSE[] argumentTypes, ObjectSE[] arguments)
      必要に応じて新しいクラスを生成し、指定されたコールバック(存在する場合)を使用して新しいオブジェクトインスタンスを作成します。指定された引数を使用して、argumentTypes パラメーターに一致するスーパークラスのコンストラクターを使用します。
      パラメーター:
      argumentTypes - コンストラクターの署名
      arguments - コンストラクターに渡す互換性のあるラップされた引数
      戻り値:
      新しいインスタンス
    • createClass

      public ClassSE createClass()
      必要に応じて新しいクラスを生成し、新しいインスタンスを作成せずにそれを返します。これは、設定されているコールバックを無視します。新しいインスタンスを作成するには、リフレクションを使用する必要があり、コンストラクター中に呼び出されたメソッドはインターセプトされません。この問題を回避するには、マルチ引数 create メソッドを使用します。
      関連事項:
    • setSerialVersionUID

      public void setSerialVersionUID(LongSE sUID)
      生成されたクラスに静的 serialVersionUID フィールドを挿入します。
      パラメーター:
      sUID - フィールド値、またはフィールドの生成を回避する場合は null。
    • generate

      オーバーライド:
      クラス AbstractClassGeneratorgenerate 
    • getDefaultClassLoader

      protected ClassLoaderSE getDefaultClassLoader()
      次で指定:
      クラス AbstractClassGeneratorgetDefaultClassLoader 
    • getProtectionDomain

      protected ProtectionDomainSE getProtectionDomain()
      クラスからコピーされた説明: AbstractClassGenerator
      クラスを定義するときに使用する保護ドメインを返します。

      デフォルトの実装では、デフォルトの保護ドメインを使用するために null を返します。サブクラスは、より具体的な保護ドメインを使用するようにオーバーライドできます。

      オーバーライド:
      クラス AbstractClassGeneratorgetProtectionDomain 
      戻り値:
      保護ドメイン (デフォルトを使用するための null )
    • getMethods

      public static void getMethods(ClassSE superclass, ClassSE[] interfaces, ListSE methods)
      指定されたスーパークラスとインターフェースを使用して、エンハンサーによって生成されたクラスによって拡張されるすべてのメソッドを検索します。これは、コールバックオブジェクトのリストを作成できます。指定されたリストの最後にメソッドが追加されます。エンハンサーによって生成されたクラスのサブクラス化の性質により、メソッドは非静的、非最終、非プライベートであることが保証されています。複数のクラスで発生する場合でも、各メソッドシグネチャーは 1 回だけ発生します。
      パラメーター:
      superclass - 拡張されるクラス、または null
      interfaces - 実装されるインターフェースのリスト、または null
      methods - 該当するメソッドをコピーするリスト
    • generateClass

      public void generateClass(ClassVisitor v) throws ExceptionSE
      例外:
      ExceptionSE
    • filterConstructors

      protected void filterConstructors(ClassSE sc, ListSE constructors)
      スーパークラスからコンストラクターのリストをフィルターします。残っているコンストラクターは、生成されたクラスに含まれます。デフォルトの実装では、すべてのプライベートコンストラクターをフィルターで除外しますが、サブクラスはこの動作をオーバーライドするために Enhancer を継承できます。
      パラメーター:
      sc - スーパークラス
      constructors - スーパークラスから宣言されたすべてのコンストラクターのリスト
      例外:
      IllegalArgumentExceptionSE - 非プライベートコンストラクターがない場合
    • firstInstance

      protected ObjectSE firstInstance(ClassSE type) throws ExceptionSE
      このメソッドは、通常のフローでは呼び出さないでください。技術的に言えば、wrapCachedClass(Class) は Enhancer.EnhancerFactoryData をキャッシュ値として使用します。後者は、従来のリフレクションルックアップおよび呼び出しよりも高速なインスタンス化を可能にします。このメソッドは、下位互換性の理由からそのまま残されています。これまでに使用された場合に備えて。
      次で指定:
      クラス AbstractClassGeneratorfirstInstance 
      パラメーター:
      type - インスタンス化するクラス
      戻り値:
      新しく作成されたプロキシインスタンス
      例外:
      ExceptionSE - 何かがうまくいかない場合
    • nextInstance

      protected ObjectSE nextInstance(ObjectSE instance)
      次で指定:
      クラス AbstractClassGeneratornextInstance 
    • wrapCachedClass

      protected ObjectSE wrapCachedClass(ClassSE klass)
      オーバーライド:
      クラス AbstractClassGeneratorwrapCachedClass 
    • unwrapCachedValue

      protected ObjectSE unwrapCachedValue(ObjectSE cached)
      オーバーライド:
      クラス AbstractClassGeneratorunwrapCachedValue 
    • registerCallbacks

      public static void registerCallbacks(ClassSE generatedClass, Callback[] callbacks)
      リフレクションを介して生成されたクラスの新しいインスタンスを作成する前に、このメソッドを呼び出して使用する Callback 配列を登録します。Enhancer または Factory インターフェースのインスタンスを使用して新しいインスタンスを作成する場合、このメソッドは不要です。その主な用途は、生成されたクラスを自分でキャッシュして再利用したい場合であり、生成されたクラスは Factory インターフェースを実装していませ

      このメソッドは、現在のスレッドにのみコールバックを登録することに注意してください。複数のスレッドによって作成されたインスタンスのコールバックを登録する場合は、registerStaticCallbacks(java.lang.Class, org.springframework.cglib.proxy.Callback[]) を使用します。

      create メソッド ( create() など) または Factory newInstance メソッドを呼び出すと、登録されたコールバックは上書きされ、その後クリアされます。それ以外の場合はクリアされません。メモリリークが懸念される場合は、リフレクションを介して新しいインスタンスを作成した後、慎重に null に戻す必要があります。

      パラメーター:
      generatedClass - 以前に Enhancer によって作成されたクラス
      callbacks - 生成されたクラスのインスタンスが作成されるときに使用するコールバックの配列
      関連事項:
    • registerStaticCallbacks

      public static void registerStaticCallbacks(ClassSE generatedClass, Callback[] callbacks)
      registerCallbacks(java.lang.Class, org.springframework.cglib.proxy.Callback[]) に似ていますが、複数のスレッドが生成されたクラスのインスタンスを作成する場合に使用するのに適しています。スレッドレベルのコールバックは、常に静的コールバックをオーバーライドします。静的コールバックがクリアされることはありません。
      パラメーター:
      generatedClass - 以前に Enhancer によって作成されたクラス
      callbacks - 生成されたクラスのインスタンスが作成されるときに使用するコールバックの配列
    • isEnhanced

      public static boolean isEnhanced(ClassSE type)
      クラスが Enhancer を使用して生成されたかどうかを判別します。
      パラメーター:
      type - 任意のクラス
      戻り値:
      クラスが Enhancer を使用して生成されたかどうか
    • create

      public static ObjectSE create(ClassSE type, Callback callback)
      インターセプトされたオブジェクトを作成するためのヘルパーメソッド。生成されたインスタンスをより細かく制御するには、この静的メソッドの代わりに Enhancer の新しいインスタンスを使用します。
      パラメーター:
      type - 拡張するクラスまたは実装するインターフェース
      callback - すべてのメソッドに使用するコールバック
    • create

      public static ObjectSE create(ClassSE superclass, ClassSE[] interfaces, Callback callback)
      インターセプトされたオブジェクトを作成するためのヘルパーメソッド。生成されたインスタンスをより細かく制御するには、この静的メソッドの代わりに Enhancer の新しいインスタンスを使用します。
      パラメーター:
      superclass - 拡張するクラスまたは実装するインターフェース
      interfaces - 実装するインターフェースの配列、または null
      callback - すべてのメソッドに使用するコールバック
    • create

      public static ObjectSE create(ClassSE superclass, ClassSE[] interfaces, CallbackFilter filter, Callback[] callbacks)
      インターセプトされたオブジェクトを作成するためのヘルパーメソッド。生成されたインスタンスをより細かく制御するには、この静的メソッドの代わりに Enhancer の新しいインスタンスを使用します。
      パラメーター:
      superclass - 拡張するクラスまたは実装するインターフェース
      interfaces - 実装するインターフェースの配列、または null
      filter - 新しいクラスを生成するときに使用するコールバックフィルター
      callbacks - 拡張オブジェクトに使用するコールバックの実装