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 を作成します。 |
修飾子と型 | メソッドと説明 |
---|---|
java.lang.Object | create() 必要に応じて新しいクラスを生成し、指定されたコールバック(存在する場合)を使用して新しいオブジェクトインスタンスを作成します。 |
java.lang.Object | create(java.lang.Class[] argumentTypes, java.lang.Object[] arguments) 必要に応じて新しいクラスを生成し、指定されたコールバック(存在する場合)を使用して新しいオブジェクトインスタンスを作成します。 |
static java.lang.Object | create(java.lang.Class type, org.springframework.cglib.proxy.Callback callback) インターセプトされたオブジェクトを作成するためのヘルパーメソッド。 |
static java.lang.Object | create(java.lang.Class superclass, java.lang.Class[] interfaces, org.springframework.cglib.proxy.Callback callback) インターセプトされたオブジェクトを作成するためのヘルパーメソッド。 |
static java.lang.Object | create(java.lang.Class superclass, java.lang.Class[] interfaces, org.springframework.cglib.proxy.CallbackFilter filter, org.springframework.cglib.proxy.Callback[] callbacks) インターセプトされたオブジェクトを作成するためのヘルパーメソッド。 |
java.lang.Class | createClass() 必要に応じて新しいクラスを生成し、新しいインスタンスを作成せずにそれを返します。 |
protected void | filterConstructors(java.lang.Class sc, java.util.List constructors) スーパークラスからコンストラクターのリストをフィルターに掛けます。 |
protected java.lang.Object | firstInstance(java.lang.Class type) このメソッドは、通常のフローでは呼び出さないでください。 |
protected java.lang.Class | generate(AbstractClassGenerator.ClassLoaderData data) |
void | generateClass(ClassVisitor v) |
protected java.lang.ClassLoader | getDefaultClassLoader() |
static void | getMethods(java.lang.Class superclass, java.lang.Class[] interfaces, java.util.List methods) 指定されたスーパークラスとインターフェースを使用して、エンハンサーによって生成されたクラスによって拡張されるすべてのメソッドを検索します。 |
protected java.security.ProtectionDomain | getProtectionDomain() クラスを定義するときに使用する保護ドメインを返します。 |
static boolean | isEnhanced(java.lang.Class type) クラスが Enhancer を使用して生成されたかどうかを判別します。 |
protected java.lang.Object | nextInstance(java.lang.Object instance) |
static void | registerCallbacks(java.lang.Class generatedClass, org.springframework.cglib.proxy.Callback[] callbacks) このメソッドを呼び出して、リフレクションを介して生成されたクラスの新しいインスタンスを作成する前に、使用する Callback 配列を登録します。 |
static void | registerStaticCallbacks(java.lang.Class 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(java.lang.Class callbackType) 使用する Callback のシングル型を設定します。 |
void | setCallbackTypes(java.lang.Class[] callbackTypes) 使用するコールバック型の配列を設定します。 |
void | setInterceptDuringConstruction(boolean interceptDuringConstruction) プロキシのコンストラクター内から呼び出されたメソッドをインターセプトするかどうかを設定します。 |
void | setInterfaces(java.lang.Class[] interfaces) 実装するインターフェースを設定します。 |
void | setSerialVersionUID(java.lang.Long sUID) 生成されたクラスに静的 serialVersionUID フィールドを挿入します。 |
void | setSuperclass(java.lang.Class superclass) 生成されたクラスが拡張するクラスを設定します。 |
void | setUseFactory(boolean useFactory) 拡張オブジェクトインスタンスが Factory インターフェースを実装する必要があるかどうかを設定します。 |
protected java.lang.Object | unwrapCachedValue(java.lang.Object cached) |
protected java.lang.Object | wrapCachedClass(java.lang.Class klass) |
create, getAttemptLoad, getClassLoader, getClassName, getCurrent, getNamingPolicy, getStrategy, getUseCache, setAttemptLoad, setClassLoader, setContextClass, setNamePrefix, setNamingPolicy, setStrategy, setUseCache
public Enhancer()
Enhancer
を作成します。生成されたオブジェクトごとに新しい Enhancer
オブジェクトを使用する必要があり、スレッド間で共有しないでください。生成されたクラスの追加インスタンスを作成するには、Factory
インターフェースを使用します。Factory
public void setSuperclass(java.lang.Class superclass)
setInterfaces
が呼び出されます。非インターフェース引数は final として宣言してはならず、アクセス可能なコンストラクターを持っている必要があります。superclass
- 拡張するクラスまたは実装するインターフェース setInterfaces(Class[])
public void setInterfaces(java.lang.Class[] interfaces)
Factory
インターフェースは、ここで指定されている内容に関係なく、常に実装されます。interfaces
- 実装するインターフェースの配列、または nullFactory
public 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(java.lang.Class callbackType)
Callback
のシングル型を設定します。これは、createClass()
を呼び出すときに、setCallback(org.springframework.cglib.proxy.Callback)
の代わりに使用できます。これは、実際のコールバックインスタンスの配列を持つことができない場合があるためです。callbackType
- すべてのメソッドに使用するコールバックの型 setCallbackTypes(java.lang.Class[])
public void setCallbackTypes(java.lang.Class[] callbackTypes)
createClass()
を呼び出すときに、setCallbacks(org.springframework.cglib.proxy.Callback[])
の代わりに使用できます。これは、実際のコールバックインスタンスの配列を持つことができない場合があるためです。プロキシされたクラスの各メソッドのこの配列へのインデックスを指定するには、CallbackFilter
を使用する必要があります。callbackTypes
- コールバック型の配列 public java.lang.Object create()
public java.lang.Object create(java.lang.Class[] argumentTypes, java.lang.Object[] arguments)
argumentTypes
パラメーターに一致するスーパークラスのコンストラクターを使用します。argumentTypes
- コンストラクターの署名 arguments
- コンストラクターに渡す互換性のあるラップされた引数 public java.lang.Class createClass()
create
メソッドを使用します。public void setSerialVersionUID(java.lang.Long sUID)
sUID
- フィールド値、またはフィールドの生成を回避する場合は null。protected java.lang.Class generate(AbstractClassGenerator.ClassLoaderData data)
AbstractClassGenerator
の generate
protected java.lang.ClassLoader getDefaultClassLoader()
AbstractClassGenerator
の getDefaultClassLoader
protected java.security.ProtectionDomain getProtectionDomain()
AbstractClassGenerator
デフォルトの実装では、デフォルトの保護ドメインを使用するために null
を返します。サブクラスは、より具体的な保護ドメインを使用するようにオーバーライドできます。
AbstractClassGenerator
の getProtectionDomain
null
)public static void getMethods(java.lang.Class superclass, java.lang.Class[] interfaces, java.util.List methods)
superclass
- 拡張されるクラス、または nullinterfaces
- 実装されるインターフェースのリスト、または nullmethods
- 該当するメソッドをコピーするリスト public void generateClass(ClassVisitor v) throws java.lang.Exception
java.lang.Exception
protected void filterConstructors(java.lang.Class sc, java.util.List constructors)
sc
- スーパークラス constructors
- スーパークラスから宣言されたすべてのコンストラクターのリスト java.lang.IllegalArgumentException
- 非プライベートコンストラクターがない場合 protected java.lang.Object firstInstance(java.lang.Class type) throws java.lang.Exception
wrapCachedClass(Class)
は EnhancerFactoryData
をキャッシュ値として使用します。後者は、従来のリフレクションルックアップおよび呼び出しよりも高速なインスタンス化を可能にします。このメソッドは、下位互換性の理由からそのまま残されています。これまでに使用された場合に備えて。AbstractClassGenerator
の firstInstance
type
- インスタンス化するクラス java.lang.Exception
- 何かがうまくいかない場合 protected java.lang.Object nextInstance(java.lang.Object instance)
AbstractClassGenerator
の nextInstance
protected java.lang.Object wrapCachedClass(java.lang.Class klass)
AbstractClassGenerator
の wrapCachedClass
protected java.lang.Object unwrapCachedValue(java.lang.Object cached)
AbstractClassGenerator
の unwrapCachedValue
public static void registerCallbacks(java.lang.Class 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(java.lang.Class generatedClass, org.springframework.cglib.proxy.Callback[] callbacks)
registerCallbacks(java.lang.Class, org.springframework.cglib.proxy.Callback[])
に似ていますが、複数のスレッドが生成されたクラスのインスタンスを作成する場合に使用するのに適しています。スレッドレベルのコールバックは、常に静的コールバックをオーバーライドします。静的コールバックがクリアされることはありません。generatedClass
- 以前に Enhancer
によって作成されたクラス callbacks
- 生成されたクラスのインスタンスが作成されるときに使用するコールバックの配列 public static boolean isEnhanced(java.lang.Class type)
Enhancer
を使用して生成されたかどうかを判別します。type
- 任意のクラス Enhancer
を使用して生成されたかどうか public static java.lang.Object create(java.lang.Class type, org.springframework.cglib.proxy.Callback callback)
Enhancer
の新しいインスタンスを使用します。type
- 拡張するクラスまたは実装するインターフェース callback
- すべてのメソッドに使用するコールバック public static java.lang.Object create(java.lang.Class superclass, java.lang.Class[] interfaces, org.springframework.cglib.proxy.Callback callback)
Enhancer
の新しいインスタンスを使用します。superclass
- 拡張するクラスまたは実装するインターフェース interfaces
- 実装するインターフェースの配列、または nullcallback
- すべてのメソッドに使用するコールバック public static java.lang.Object create(java.lang.Class superclass, java.lang.Class[] interfaces, org.springframework.cglib.proxy.CallbackFilter filter, org.springframework.cglib.proxy.Callback[] callbacks)
Enhancer
の新しいインスタンスを使用します。superclass
- 拡張するクラスまたは実装するインターフェース interfaces
- 実装するインターフェースの配列、または nullfilter
- 新しいクラスを生成するときに使用するコールバックフィルター callbacks
- 拡張オブジェクトに使用するコールバックの実装