public interface SmartClassLoader
ClassLoader がこのインターフェースを実装していない場合、そこから取得されたすべてのクラスは、再ロード可能 (つまり、キャッシュ可能) ではないと見なされます。
修飾子と型 | メソッドと説明 |
---|---|
default ClassLoaderSE | getOriginalClassLoader() この SmartClassLoader の元の ClassLoader を返すか、自給自足の場合は現在のローダー自体を返す可能性があります。 |
default boolean | isClassReloadable(ClassSE<?> clazz) 指定されたクラスが(この ClassLoader で)再読み込み可能かどうかを判断します。 |
default ClassSE<?> | publicDefineClass(StringSE name, byte[] b, ProtectionDomainSE protectionDomain) このクラスローダーでカスタムクラス(通常は CGLIB プロキシクラス)を定義します。 |
default boolean isClassReloadable(ClassSE<?> clazz)
通常、結果がキャッシュされるかどうか(この ClassLoader の場合)、または結果を毎回再取得する必要があるかどうかを確認するために使用されます。デフォルトの実装は常に false
を返します。
clazz
- チェックするクラス (通常、この ClassLoader からロードされます)Class
オブジェクトを使用して)再ロードされたバージョンに表示されると予想されるかどうか default ClassLoaderSE getOriginalClassLoader()
デフォルトの実装では、ローカル ClassLoader 参照がそのまま返されます。ベースアプリケーションクラスローダーからの影響を受けないクラスを一般的に処理するリロード可能または他の選択的にオーバーライドする ClassLoader の場合、これは、現在のローダーが派生した元の ClassLoader を返すように実装する必要があります(たとえば、return getParent();
を介して)。
これは、ターゲットクラスが現在のクラスローダーで定義されていない場合に、特定のプロキシのクラスローダーを決定するために Spring の AOP フレームワークで特に使用されます。リロード可能なクラスローダーの場合、リロード可能なクラスローダー自体で定義されていない一般的なクラスをプロキシするための基本アプリケーションクラスローダーをお勧めします。
ClassLoader.getParent()
SE, AbstractAutoProxyCreator
default ClassSE<?> publicDefineClass(StringSE name, byte[] b, @Nullable ProtectionDomainSE protectionDomain)
これは、伝統的にリフレクションを介して呼び出される ClassLoader
SE の保護された defineClass(String, byte[], int, int, ProtectionDomain)
メソッドのパブリック同等物です。カスタムクラスローダーでの具体的な実装では、JDK 9 以降で「不正アクセス」の警告なしにクラスローダー固有の定義を公開するために、その protected メソッドに委譲する必要があります: return defineClass(name, b, 0, b.length, protectionDomain)
。JDK 9+ Lookup#defineClass
メソッドは、新しい定義のカスタムターゲットクラスローダーをサポートしていないことに注意してください。むしろ、ルックアップのコンテキストクラスと同じクラスローダーでクラスを常に定義します。
name
- クラスの名前 b
- クラスを定義するバイト protectionDomain
- クラスの保護ドメイン(ある場合)LinkageErrorSE
- クラス定義が悪い場合 SecurityExceptionSE
- 無効な定義の試みの場合 UnsupportedOperationExceptionSE
- カスタム定義の試みが不可能な場合 (このインターフェースのデフォルトの実装によってスローされます)ClassLoader.defineClass(String, byte[], int, int, ProtectionDomain)
SE