クラス 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 ObjectSE
create
(ClassSE superclass, ClassSE[] interfaces, CallbackFilter filter, Callback[] callbacks) インターセプトされたオブジェクトを作成するためのヘルパーメソッド。static ObjectSE
インターセプトされたオブジェクトを作成するためのヘルパーメソッド。必要に応じて新しいクラスを生成し、新しいインスタンスを作成せずにそれを返します。protected void
filterConstructors
(ClassSE sc, ListSE constructors) スーパークラスからコンストラクターのリストをフィルターに掛けます。protected ObjectSE
firstInstance
(ClassSE type) このメソッドは、通常のフローでは呼び出さないでください。protected ClassSE
void
protected ClassLoaderSE
static void
getMethods
(ClassSE superclass, ClassSE[] interfaces, ListSE methods) 指定されたスーパークラスとインターフェースを使用して、エンハンサーによって生成されたクラスによって拡張されるすべてのメソッドを検索します。protected ProtectionDomainSE
クラスを定義するときに使用する保護ドメインを返します。static boolean
isEnhanced
(ClassSE type) クラスがEnhancer
を使用して生成されたかどうかを判別します。protected ObjectSE
nextInstance
(ObjectSE instance) static void
registerCallbacks
(ClassSE generatedClass, Callback[] callbacks) リフレクションを介して生成されたクラスの新しいインスタンスを作成する前に、このメソッドを呼び出して使用するCallback
配列を登録します。static void
registerStaticCallbacks
(ClassSE generatedClass, Callback[] callbacks) registerCallbacks(java.lang.Class, org.springframework.cglib.proxy.Callback[])
に似ていますが、複数のスレッドが生成されたクラスのインスタンスを作成する場合に使用するのに適しています。void
setCallback
(Callback callback) シングルCallback
を使用するように設定します。void
setCallbackFilter
(CallbackFilter filter) 生成されたクラスのメソッドを特定のコールバックインデックスにマップするために使用されるCallbackFilter
を設定します。void
setCallbacks
(Callback[] callbacks) 使用するコールバックの配列を設定します。void
setCallbackType
(ClassSE callbackType) 使用するCallback
のシングル型を設定します。void
setCallbackTypes
(ClassSE[] callbackTypes) 使用するコールバック型の配列を設定します。void
setInterceptDuringConstruction
(boolean interceptDuringConstruction) プロキシのコンストラクター内から呼び出されたメソッドをインターセプトするかどうかを設定します。void
setInterfaces
(ClassSE[] interfaces) 実装するインターフェースを設定します。void
setSerialVersionUID
(LongSE sUID) 生成されたクラスに静的 serialVersionUID フィールドを挿入します。void
setSuperclass
(ClassSE superclass) 生成されたクラスが拡張するクラスを設定します。void
setUseFactory
(boolean useFactory) 拡張オブジェクトインスタンスがFactory
インターフェースを実装するかどうかを設定します。protected ObjectSE
unwrapCachedValue
(ObjectSE cached) protected ObjectSE
wrapCachedClass
(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()
など) またはFactory
newInstance
メソッドを呼び出すと、登録されたコールバックは上書きされ、その後クリアされます。それ以外の場合はクリアされません。メモリリークが懸念される場合は、リフレクションを介して新しいインスタンスを作成した後、慎重に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
- 拡張オブジェクトに使用するコールバックの実装