クラス Enhancer
- 実装されているすべてのインターフェース:
ClassGenerator
元の最も一般的なコールバック型は MethodInterceptor です。これは、AOP 用語で「アラウンドアドバイス」を有効にします。--that は、「スーパー」メソッドの呼び出しの前後の両方でカスタムコードを呼び出すことができます。さらに、スーパーメソッドを呼び出す前に引数を変更することも、まったく呼び出さないようにすることもできます。
MethodInterceptor は、あらゆるインターセプトのニーズを満たすのに十分な汎用性を備えていますが、多くの場合、やり過ぎです。シンプルさとパフォーマンスのために、LazyLoader などの追加の特殊なコールバック型も利用できます。多くの場合、拡張クラスごとに 1 つのコールバックが使用されますが、どのコールバックを使用するかは CallbackFilter を使用してメソッドごとに制御できます。
このクラスの最も一般的な使用箇所は、静的ヘルパーメソッドで具体化されます。使用する ClassLoader のカスタマイズなどの高度なニーズについては、Enhancer の新しいインスタンスを作成する必要があります。CGLIB 内の他のクラスも同様のパターンに従います。
setUseFactory(boolean) を使用してこの機能を明示的に無効にしない限り、すべての拡張オブジェクトは Factory インターフェースを実装します。Factory インターフェースは、既存のオブジェクトのコールバックを変更するための API を提供するだけでなく、同じ型の新しいインスタンスをより迅速かつ簡単に作成する方法も提供します。
java.lang.reflect.Proxy のほぼ完全な置き換えについては、Proxy クラスを参照してください。
ネストされたクラスの要約
クラス org.springframework.cglib.core.AbstractClassGenerator から継承されたネストクラス / インターフェース
AbstractClassGenerator.ClassLoaderData, AbstractClassGenerator.Sourceコンストラクターの概要
コンストラクターメソッドのサマリー
修飾子と型メソッド説明create()必要に応じて新しいクラスを生成し、指定されたコールバック(存在する場合)を使用して新しいオブジェクトインスタンスを作成します。必要に応じて新しいクラスを生成し、指定されたコールバック(存在する場合)を使用して新しいオブジェクトインスタンスを作成します。static ObjectSEインターセプトされたオブジェクトを作成するためのヘルパーメソッド。static ObjectSEcreate(ClassSE superclass, ClassSE[] interfaces, CallbackFilter filter, Callback[] callbacks) インターセプトされたオブジェクトを作成するためのヘルパーメソッド。static ObjectSEインターセプトされたオブジェクトを作成するためのヘルパーメソッド。必要に応じて新しいクラスを生成し、新しいインスタンスを作成せずにそれを返します。protected voidfilterConstructors(ClassSE sc, ListSE constructors) スーパークラスからコンストラクターのリストをフィルターに掛けます。protected ObjectSEfirstInstance(ClassSE type) このメソッドは、通常のフローでは呼び出さないでください。protected ClassSEvoidprotected ClassLoaderSEstatic voidgetMethods(ClassSE superclass, ClassSE[] interfaces, ListSE methods) 指定されたスーパークラスとインターフェースを使用して、エンハンサーによって生成されたクラスによって拡張されるすべてのメソッドを検索します。protected ProtectionDomainSEクラスを定義するときに使用する保護ドメインを返します。static booleanisEnhanced(ClassSE type) クラスがEnhancerを使用して生成されたかどうかを判別します。protected ObjectSEnextInstance(ObjectSE instance) static voidregisterCallbacks(ClassSE generatedClass, Callback[] callbacks) リフレクションを介して生成されたクラスの新しいインスタンスを作成する前に、このメソッドを呼び出して使用するCallback配列を登録します。static voidregisterStaticCallbacks(ClassSE generatedClass, Callback[] callbacks) registerCallbacks(java.lang.Class, org.springframework.cglib.proxy.Callback[])に似ていますが、複数のスレッドが生成されたクラスのインスタンスを作成する場合に使用するのに適しています。voidsetCallback(Callback callback) シングルCallbackを使用するように設定します。voidsetCallbackFilter(CallbackFilter filter) 生成されたクラスのメソッドを特定のコールバックインデックスにマップするために使用されるCallbackFilterを設定します。voidsetCallbacks(Callback[] callbacks) 使用するコールバックの配列を設定します。voidsetCallbackType(ClassSE callbackType) 使用するCallbackのシングル型を設定します。voidsetCallbackTypes(ClassSE[] callbackTypes) 使用するコールバック型の配列を設定します。voidsetInterceptDuringConstruction(boolean interceptDuringConstruction) プロキシのコンストラクター内から呼び出されたメソッドをインターセプトするかどうかを設定します。voidsetInterfaces(ClassSE[] interfaces) 実装するインターフェースを設定します。voidsetSerialVersionUID(LongSE sUID) 生成されたクラスに静的 serialVersionUID フィールドを挿入します。voidsetSuperclass(ClassSE superclass) 生成されたクラスが拡張するクラスを設定します。voidsetUseFactory(boolean useFactory) 拡張オブジェクトインスタンスがFactoryインターフェースを実装するかどうかを設定します。protected ObjectSEunwrapCachedValue(ObjectSE cached) protected ObjectSEwrapCachedClass(ClassSE klass) クラス org.springframework.cglib.core.AbstractClassGenerator から継承されたメソッド
create, getAttemptLoad, getClassLoader, getClassName, getCurrent, getNamingPolicy, getStrategy, getUseCache, setAttemptLoad, setClassLoader, setContextClass, setNamePrefix, setNamingPolicy, setStrategy, setUseCache
コンストラクターの詳細
Enhancer
public Enhancer()新しいEnhancerを作成します。生成されたオブジェクトごとに新しいEnhancerオブジェクトを使用する必要があり、スレッド間で共有しないでください。生成されたクラスの追加インスタンスを作成するには、Factoryインターフェースを使用します。- 関連事項:
メソッドの詳細
setSuperclass
生成されたクラスが拡張するクラスを設定します。便宜上、提供されたスーパークラスが実際にインターフェースである場合、代わりに適切な引数を使用してsetInterfacesが呼び出されます。非インターフェース引数は final として宣言してはならず、アクセス可能なコンストラクターを持っている必要があります。- パラメーター:
superclass- 拡張するクラスまたは実装するインターフェース- 関連事項:
setInterfaces
実装するインターフェースを設定します。Factoryインターフェースは、ここで指定されている内容に関係なく、常に実装されます。- パラメーター:
interfaces- 実装するインターフェースの配列、または null- 関連事項:
setCallbackFilter
生成されたクラスのメソッドを特定のコールバックインデックスにマップするために使用されるCallbackFilterを設定します。新しいオブジェクトインスタンスは常に同じマッピングを使用しますが、異なる実際のコールバックオブジェクトを使用する場合があります。- パラメーター:
filter- 新しいクラスを生成するときに使用するコールバックフィルター- 関連事項:
setCallback
シングルCallbackを使用するように設定します。createClass()を使用する場合は無視されます。- パラメーター:
callback- すべてのメソッドに使用するコールバック- 関連事項:
setCallbacks
使用するコールバックの配列を設定します。createClass()を使用する場合は無視されます。CallbackFilterを使用して、プロキシされたクラスの各メソッドのこの配列にインデックスを指定する必要があります。- パラメーター:
callbacks- コールバック配列- 関連事項:
setUseFactory
public void setUseFactory(boolean useFactory) 拡張オブジェクトインスタンスがFactoryインターフェースを実装するかどうかを設定します。これは、プロキシがターゲットとより見分けがつかないようにする必要があるツールのために追加されました。また、場合によっては、コードが基になるコールバックを変更するのを防ぐために、Factoryインターフェースを無効にする必要があります。- パラメーター:
useFactory-Factoryを実装するかどうか ; デフォルトはtrueです
setInterceptDuringConstruction
public void setInterceptDuringConstruction(boolean interceptDuringConstruction) プロキシのコンストラクター内から呼び出されたメソッドをインターセプトするかどうかを設定します。デフォルト値は true です。インターセプトされていないメソッドは、プロキシの基本クラスのメソッドが存在する場合、それを呼び出します。- パラメーター:
interceptDuringConstruction- コンストラクターから呼び出されたメソッドをインターセプトするかどうか
setCallbackType
使用するCallbackのシングル型を設定します。これは、実際のコールバックインスタンスの配列を持つことができない場合があるため、createClass()を呼び出すときにsetCallback(org.springframework.cglib.proxy.Callback)の代わりに使用できます。- パラメーター:
callbackType- すべてのメソッドに使用するコールバックの型- 関連事項:
setCallbackTypes
使用するコールバック型の配列を設定します。これは、実際のコールバックインスタンスの配列を持つことができないため、createClass()を呼び出すときにsetCallbacks(org.springframework.cglib.proxy.Callback[])の代わりに使用できます。CallbackFilterを使用して、プロキシされたクラスの各メソッドのこの配列にインデックスを指定する必要があります。- パラメーター:
callbackTypes- コールバック型の配列
create
必要に応じて新しいクラスを生成し、指定されたコールバック(存在する場合)を使用して新しいオブジェクトインスタンスを作成します。スーパークラスの引数なしのコンストラクターを使用します。- 戻り値:
- 新しいインスタンス
create
必要に応じて新しいクラスを生成し、指定されたコールバック(存在する場合)を使用して新しいオブジェクトインスタンスを作成します。指定された引数を使用して、argumentTypesパラメーターに一致するスーパークラスのコンストラクターを使用します。- パラメーター:
argumentTypes- コンストラクターの署名arguments- コンストラクターに渡す互換性のあるラップされた引数- 戻り値:
- 新しいインスタンス
createClass
必要に応じて新しいクラスを生成し、新しいインスタンスを作成せずにそれを返します。これは、設定されているコールバックを無視します。新しいインスタンスを作成するには、リフレクションを使用する必要があり、コンストラクター中に呼び出されたメソッドはインターセプトされません。この問題を回避するには、マルチ引数createメソッドを使用します。setSerialVersionUID
生成されたクラスに静的 serialVersionUID フィールドを挿入します。- パラメーター:
sUID- フィールド値、またはフィールドの生成を回避する場合は null。
generate
- オーバーライド:
- クラス
AbstractClassGeneratorのgenerate
getDefaultClassLoader
- 次で指定:
- クラス
AbstractClassGeneratorのgetDefaultClassLoader
getProtectionDomain
クラスからコピーされた説明:AbstractClassGeneratorクラスを定義するときに使用する保護ドメインを返します。デフォルトの実装では、デフォルトの保護ドメインを使用するために
nullを返します。サブクラスは、より具体的な保護ドメインを使用するようにオーバーライドできます。- オーバーライド:
- クラス
AbstractClassGeneratorのgetProtectionDomain - 戻り値:
- 保護ドメイン (デフォルトを使用するための
null)
getMethods
指定されたスーパークラスとインターフェースを使用して、エンハンサーによって生成されたクラスによって拡張されるすべてのメソッドを検索します。これは、コールバックオブジェクトのリストを作成できます。指定されたリストの最後にメソッドが追加されます。エンハンサーによって生成されたクラスのサブクラス化の性質により、メソッドは非静的、非最終、非プライベートであることが保証されています。複数のクラスで発生する場合でも、各メソッドシグネチャーは 1 回だけ発生します。- パラメーター:
superclass- 拡張されるクラス、または nullinterfaces- 実装されるインターフェースのリスト、または nullmethods- 該当するメソッドをコピーするリスト
generateClass
- 例外:
ExceptionSE
filterConstructors
スーパークラスからコンストラクターのリストをフィルターします。残っているコンストラクターは、生成されたクラスに含まれます。デフォルトの実装では、すべてのプライベートコンストラクターをフィルターで除外しますが、サブクラスはこの動作をオーバーライドするために Enhancer を継承できます。- パラメーター:
sc- スーパークラスconstructors- スーパークラスから宣言されたすべてのコンストラクターのリスト- 例外:
IllegalArgumentExceptionSE- 非プライベートコンストラクターがない場合
firstInstance
このメソッドは、通常のフローでは呼び出さないでください。技術的に言えば、wrapCachedClass(Class)はEnhancer.EnhancerFactoryDataをキャッシュ値として使用します。後者は、従来のリフレクションルックアップおよび呼び出しよりも高速なインスタンス化を可能にします。このメソッドは、下位互換性の理由からそのまま残されています。これまでに使用された場合に備えて。- 次で指定:
- クラス
AbstractClassGeneratorのfirstInstance - パラメーター:
type- インスタンス化するクラス- 戻り値:
- 新しく作成されたプロキシインスタンス
- 例外:
ExceptionSE- 何かがうまくいかない場合
nextInstance
- 次で指定:
- クラス
AbstractClassGeneratorのnextInstance
wrapCachedClass
- オーバーライド:
- クラス
AbstractClassGeneratorのwrapCachedClass
unwrapCachedValue
- オーバーライド:
- クラス
AbstractClassGeneratorのunwrapCachedValue
registerCallbacks
リフレクションを介して生成されたクラスの新しいインスタンスを作成する前に、このメソッドを呼び出して使用するCallback配列を登録します。EnhancerまたはFactoryインターフェースのインスタンスを使用して新しいインスタンスを作成する場合、このメソッドは不要です。その主な用途は、生成されたクラスを自分でキャッシュして再利用したい場合であり、生成されたクラスはFactoryインターフェースを実装していません。このメソッドは、現在のスレッドにのみコールバックを登録することに注意してください。複数のスレッドによって作成されたインスタンスのコールバックを登録する場合は、
registerStaticCallbacks(java.lang.Class, org.springframework.cglib.proxy.Callback[])を使用します。createメソッド (create()など) またはFactorynewInstanceメソッドを呼び出すと、登録されたコールバックは上書きされ、その後クリアされます。それ以外の場合はクリアされません。メモリリークが懸念される場合は、リフレクションを介して新しいインスタンスを作成した後、慎重にnullに戻す必要があります。- パラメーター:
generatedClass- 以前にEnhancerによって作成されたクラスcallbacks- 生成されたクラスのインスタンスが作成されるときに使用するコールバックの配列- 関連事項:
registerStaticCallbacks
registerCallbacks(java.lang.Class, org.springframework.cglib.proxy.Callback[])に似ていますが、複数のスレッドが生成されたクラスのインスタンスを作成する場合に使用するのに適しています。スレッドレベルのコールバックは、常に静的コールバックをオーバーライドします。静的コールバックがクリアされることはありません。- パラメーター:
generatedClass- 以前にEnhancerによって作成されたクラスcallbacks- 生成されたクラスのインスタンスが作成されるときに使用するコールバックの配列
isEnhanced
クラスがEnhancerを使用して生成されたかどうかを判別します。- パラメーター:
type- 任意のクラス- 戻り値:
- クラスが
Enhancerを使用して生成されたかどうか
create
インターセプトされたオブジェクトを作成するためのヘルパーメソッド。生成されたインスタンスをより細かく制御するには、この静的メソッドの代わりにEnhancerの新しいインスタンスを使用します。- パラメーター:
type- 拡張するクラスまたは実装するインターフェースcallback- すべてのメソッドに使用するコールバック
create
インターセプトされたオブジェクトを作成するためのヘルパーメソッド。生成されたインスタンスをより細かく制御するには、この静的メソッドの代わりにEnhancerの新しいインスタンスを使用します。- パラメーター:
superclass- 拡張するクラスまたは実装するインターフェースinterfaces- 実装するインターフェースの配列、または nullcallback- すべてのメソッドに使用するコールバック
create
public static ObjectSE create(ClassSE superclass, ClassSE[] interfaces, CallbackFilter filter, Callback[] callbacks) インターセプトされたオブジェクトを作成するためのヘルパーメソッド。生成されたインスタンスをより細かく制御するには、この静的メソッドの代わりにEnhancerの新しいインスタンスを使用します。- パラメーター:
superclass- 拡張するクラスまたは実装するインターフェースinterfaces- 実装するインターフェースの配列、または nullfilter- 新しいクラスを生成するときに使用するコールバックフィルターcallbacks- 拡張オブジェクトに使用するコールバックの実装