public class Enhancer extends AbstractClassGenerator
元の最も一般的なコールバック型は MethodInterceptor です。これは、AOP 用語で「アラウンドアドバイス」を可能にします。--that は、「スーパー」メソッドの呼び出しの前後の両方でカスタムコードを呼び出すことができます。さらに、スーパーメソッドを呼び出す前に引数を変更することも、まったく呼び出さないこともできます。
MethodInterceptor は、あらゆるインターセプトのニーズを満たすのに十分な汎用性を備えていますが、多くの場合、やり過ぎです。シンプルさとパフォーマンスのために、LazyLoader などの追加の特殊なコールバック型も利用できます。多くの場合、拡張クラスごとに 1 つのコールバックが使用されますが、CallbackFilter を使用して、メソッドごとに使用するコールバックを制御できます。
このクラスの最も一般的な使用箇所は、静的ヘルパーメソッドで具体化されます。使用する ClassLoader のカスタマイズなどの高度なニーズについては、Enhancer の新しいインスタンスを作成する必要があります。CGLIB 内の他のクラスも同様のパターンに従います。
setUseFactory(boolean) を使用してこの機能を明示的に無効にしない限り、すべての拡張オブジェクトは Factory インターフェースを実装します。Factory インターフェースは、既存のオブジェクトのコールバックを変更するための API と、同じ型の新しいインスタンスを作成するためのより高速で簡単な方法を提供します。
java.lang.reflect.Proxy のほぼドロップインの代替については、Proxy クラスを参照してください。
| 修飾子と型 | クラスと説明 |
|---|---|
static interface | Enhancer.EnhancerKey 内部インターフェース、ClassLoader の課題により公開のみ。 |
AbstractClassGenerator.ClassLoaderData, AbstractClassGenerator.Source| コンストラクターと説明 |
|---|
Enhancer() 新しい Enhancer を作成します。 |
| 修飾子と型 | メソッドと説明 |
|---|---|
ObjectSE | create() 必要に応じて新しいクラスを生成し、指定されたコールバック(存在する場合)を使用して新しいオブジェクトインスタンスを作成します。 |
ObjectSE | create(ClassSE[] argumentTypes, ObjectSE[] arguments) 必要に応じて新しいクラスを生成し、指定されたコールバック(存在する場合)を使用して新しいオブジェクトインスタンスを作成します。 |
static ObjectSE | create(ClassSE type, org.springframework.cglib.proxy.Callback callback) インターセプトされたオブジェクトを作成するためのヘルパーメソッド。 |
static ObjectSE | create(ClassSE superclass, ClassSE[] interfaces, org.springframework.cglib.proxy.Callback callback) インターセプトされたオブジェクトを作成するためのヘルパーメソッド。 |
static ObjectSE | create(ClassSE superclass, ClassSE[] interfaces, org.springframework.cglib.proxy.CallbackFilter filter, org.springframework.cglib.proxy.Callback[] callbacks) インターセプトされたオブジェクトを作成するためのヘルパーメソッド。 |
ClassSE | createClass() 必要に応じて新しいクラスを生成し、新しいインスタンスを作成せずにそれを返します。 |
protected void | filterConstructors(ClassSE sc, ListSE constructors) スーパークラスからコンストラクターのリストをフィルターに掛けます。 |
protected ObjectSE | firstInstance(ClassSE type) このメソッドは、通常のフローでは呼び出さないでください。 |
protected ClassSE | generate(AbstractClassGenerator.ClassLoaderData data) |
void | generateClass(ClassVisitor v) |
protected ClassLoaderSE | getDefaultClassLoader() |
static void | getMethods(ClassSE superclass, ClassSE[] interfaces, ListSE methods) 指定されたスーパークラスとインターフェースを使用して、エンハンサーによって生成されたクラスによって拡張されるすべてのメソッドを検索します。 |
protected ProtectionDomainSE | getProtectionDomain() クラスを定義するときに使用する保護ドメインを返します。 |
static boolean | isEnhanced(ClassSE type) クラスが Enhancer を使用して生成されたかどうかを判別します。 |
protected ObjectSE | nextInstance(ObjectSE instance) |
static void | registerCallbacks(ClassSE generatedClass, org.springframework.cglib.proxy.Callback[] callbacks) このメソッドを呼び出して、リフレクションを介して生成されたクラスの新しいインスタンスを作成する前に、使用する Callback 配列を登録します。 |
static void | registerStaticCallbacks(ClassSE generatedClass, org.springframework.cglib.proxy.Callback[] callbacks)registerCallbacks(java.lang.Class, org.springframework.cglib.proxy.Callback[]) に似ていますが、複数のスレッドが生成されたクラスのインスタンスを作成する場合に使用するのに適しています。 |
void | setCallback(org.springframework.cglib.proxy.Callback callback) 使用する単一の Callback を設定します。 |
void | setCallbackFilter(org.springframework.cglib.proxy.CallbackFilter filter) 生成されたクラスのメソッドを特定のコールバックインデックスにマップするために使用される CallbackFilter を設定します。 |
void | setCallbacks(org.springframework.cglib.proxy.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) |
create, getAttemptLoad, getClassLoader, getClassName, getCurrent, getNamingPolicy, getStrategy, getUseCache, setAttemptLoad, setClassLoader, setContextClass, setNamePrefix, setNamingPolicy, setStrategy, setUseCachecloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSEpublic Enhancer()
Enhancer を作成します。生成されたオブジェクトごとに新しい Enhancer オブジェクトを使用する必要があり、スレッド間で共有しないでください。生成されたクラスの追加インスタンスを作成するには、Factory インターフェースを使用します。Factorypublic void setSuperclass(ClassSE superclass)
setInterfaces が呼び出されます。非インターフェース引数は final として宣言してはならず、アクセス可能なコンストラクターを持っている必要があります。superclass - 拡張するクラスまたは実装するインターフェース setInterfaces(Class[])public void setInterfaces(ClassSE[] interfaces)
Factory インターフェースは、ここで指定されている内容に関係なく、常に実装されます。interfaces - 実装するインターフェースの配列、または nullFactorypublic void setCallbackFilter(org.springframework.cglib.proxy.CallbackFilter filter)
CallbackFilter を設定します。新しいオブジェクトインスタンスは常に同じマッピングを使用しますが、異なる実際のコールバックオブジェクトを使用する場合があります。filter - 新しいクラスを生成するときに使用するコールバックフィルター setCallbacks(org.springframework.cglib.proxy.Callback[])public void setCallback(org.springframework.cglib.proxy.Callback callback)
Callback を設定します。createClass() を使用する場合は無視されます。callback - すべてのメソッドに使用するコールバック setCallbacks(org.springframework.cglib.proxy.Callback[])public void setCallbacks(org.springframework.cglib.proxy.Callback[] callbacks)
createClass() を使用する場合は無視されます。プロキシされたクラスの各メソッドのこの配列へのインデックスを指定するには、CallbackFilter を使用する必要があります。callbacks - コールバック配列 setCallbackFilter(org.springframework.cglib.proxy.CallbackFilter), setCallback(org.springframework.cglib.proxy.Callback)public void setUseFactory(boolean useFactory)
Factory インターフェースを実装する必要があるかどうかを設定します。これは、プロキシをターゲットと区別しにくくする必要があるツールのために追加されました。また、場合によっては、コードが基になるコールバックを変更しないように、Factory インターフェースを無効にする必要があります。useFactory - Factory を実装するかどうか ; デフォルトは true です public void setInterceptDuringConstruction(boolean interceptDuringConstruction)
interceptDuringConstruction - コンストラクターから呼び出されたメソッドをインターセプトするかどうか public void setCallbackType(ClassSE callbackType)
Callback のシングル型を設定します。これは、createClass() を呼び出すときに、setCallback(org.springframework.cglib.proxy.Callback) の代わりに使用できます。これは、実際のコールバックインスタンスの配列を持つことができない場合があるためです。callbackType - すべてのメソッドに使用するコールバックの型 setCallbackTypes(java.lang.Class[])public void setCallbackTypes(ClassSE[] callbackTypes)
createClass() を呼び出すときに、setCallbacks(org.springframework.cglib.proxy.Callback[]) の代わりに使用できます。これは、実際のコールバックインスタンスの配列を持つことができない場合があるためです。プロキシされたクラスの各メソッドのこの配列へのインデックスを指定するには、CallbackFilter を使用する必要があります。callbackTypes - コールバック型の配列 public ObjectSE create()
public ObjectSE create(ClassSE[] argumentTypes, ObjectSE[] arguments)
argumentTypes パラメーターに一致するスーパークラスのコンストラクターを使用します。argumentTypes - コンストラクターの署名 arguments - コンストラクターに渡す互換性のあるラップされた引数 public ClassSE createClass()
create メソッドを使用します。public void setSerialVersionUID(LongSE sUID)
sUID - フィールド値、またはフィールドの生成を回避する場合は null。protected ClassSE generate(AbstractClassGenerator.ClassLoaderData data)
AbstractClassGenerator の generate protected ClassLoaderSE getDefaultClassLoader()
AbstractClassGenerator の getDefaultClassLoader protected ProtectionDomainSE getProtectionDomain()
AbstractClassGenerator デフォルトの実装では、デフォルトの保護ドメインを使用するために null を返します。サブクラスは、より具体的な保護ドメインを使用するようにオーバーライドできます。
AbstractClassGenerator の getProtectionDomain null )public static void getMethods(ClassSE superclass, ClassSE[] interfaces, ListSE methods)
superclass - 拡張されるクラス、または nullinterfaces - 実装されるインターフェースのリスト、または nullmethods - 該当するメソッドをコピーするリスト public void generateClass(ClassVisitor v) throws ExceptionSE
ExceptionSEprotected void filterConstructors(ClassSE sc, ListSE constructors)
sc - スーパークラス constructors - スーパークラスから宣言されたすべてのコンストラクターのリスト IllegalArgumentExceptionSE - 非プライベートコンストラクターがない場合 protected ObjectSE firstInstance(ClassSE type) throws ExceptionSE
wrapCachedClass(Class) は Enhancer.EnhancerFactoryData をキャッシュ値として使用します。後者は、従来のリフレクションルックアップおよび呼び出しよりも高速なインスタンス化を可能にします。このメソッドは、下位互換性の理由からそのまま残されています。これまでに使用された場合に備えて。AbstractClassGenerator の firstInstance type - インスタンス化するクラス ExceptionSE - 何かがうまくいかない場合 protected ObjectSE nextInstance(ObjectSE instance)
AbstractClassGenerator の nextInstance protected ObjectSE wrapCachedClass(ClassSE klass)
AbstractClassGenerator の wrapCachedClass protected ObjectSE unwrapCachedValue(ObjectSE cached)
AbstractClassGenerator の unwrapCachedValue public static void registerCallbacks(ClassSE generatedClass, org.springframework.cglib.proxy.Callback[] callbacks)
Callback 配列を登録します。Enhancer または Factory インターフェースのインスタンスを使用して新しいインスタンスを作成している場合、このメソッドは不要です。その主な用途は、生成されたクラスを自分でキャッシュして再利用する場合であり、生成されたクラスは Factory インターフェースを実装していません。 このメソッドは、現在のスレッドにのみコールバックを登録することに注意してください。複数のスレッドによって作成されたインスタンスのコールバックを登録する場合は、registerStaticCallbacks(java.lang.Class, org.springframework.cglib.proxy.Callback[]) を使用します。
登録されたコールバックは、create メソッド(create() など)または Factory newInstance メソッドのいずれかを呼び出すときに上書きされ、その後クリアされます。それ以外の場合、クリアされません。メモリリークが懸念される場合は、リフレクションを介して新しいインスタンスを作成した後、null に戻すように注意する必要があります。
generatedClass - 以前に Enhancer によって作成されたクラス callbacks - 生成されたクラスのインスタンスが作成されるときに使用するコールバックの配列 setUseFactory(boolean)public static void registerStaticCallbacks(ClassSE generatedClass, org.springframework.cglib.proxy.Callback[] callbacks)
registerCallbacks(java.lang.Class, org.springframework.cglib.proxy.Callback[]) に似ていますが、複数のスレッドが生成されたクラスのインスタンスを作成する場合に使用するのに適しています。スレッドレベルのコールバックは、常に静的コールバックをオーバーライドします。静的コールバックがクリアされることはありません。generatedClass - 以前に Enhancer によって作成されたクラス callbacks - 生成されたクラスのインスタンスが作成されるときに使用するコールバックの配列 public static boolean isEnhanced(ClassSE type)
Enhancer を使用して生成されたかどうかを判別します。type - 任意のクラス Enhancer を使用して生成されたかどうか public static ObjectSE create(ClassSE type, org.springframework.cglib.proxy.Callback callback)
Enhancer の新しいインスタンスを使用します。type - 拡張するクラスまたは実装するインターフェース callback - すべてのメソッドに使用するコールバック public static ObjectSE create(ClassSE superclass, ClassSE[] interfaces, org.springframework.cglib.proxy.Callback callback)
Enhancer の新しいインスタンスを使用します。superclass - 拡張するクラスまたは実装するインターフェース interfaces - 実装するインターフェースの配列、または nullcallback - すべてのメソッドに使用するコールバック public static ObjectSE create(ClassSE superclass, ClassSE[] interfaces, org.springframework.cglib.proxy.CallbackFilter filter, org.springframework.cglib.proxy.Callback[] callbacks)
Enhancer の新しいインスタンスを使用します。superclass - 拡張するクラスまたは実装するインターフェース interfaces - 実装するインターフェースの配列、または nullfilter - 新しいクラスを生成するときに使用するコールバックフィルター callbacks - 拡張オブジェクトに使用するコールバックの実装