パッケージ org.springframework.core

インターフェース SmartClassLoader


public interface SmartClassLoader
リロード対応の ClassLoader(Groovy ベースの ClassLoader など)によって実装されるインターフェース。たとえば、Spring の CGLIB プロキシファクトリによって検出され、キャッシュを決定します。

ClassLoader がこのインターフェースを実装していない場合、そこから取得されたすべてのクラスは、再ロード可能 (つまり、キャッシュ可能) ではないと見なされます。

導入:
2.5.1
作成者:
Juergen Hoeller
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    この SmartClassLoader の元の ClassLoader を返すか、自給自足の場合は現在のローダー自体を返す可能性があります。
    default boolean
    指定されたクラスが(この ClassLoader で)再読み込み可能かどうかを判断します。
    default ClassSE<?>
    publicDefineClass(StringSE name, byte[] b, ProtectionDomainSE protectionDomain)
    このクラスローダーでカスタムクラス(通常は CGLIB プロキシクラス)を定義します。
  • メソッドの詳細

    • isClassReloadable

      default boolean isClassReloadable(ClassSE<?> clazz)
      指定されたクラスが(この ClassLoader で)再読み込み可能かどうかを判断します。

      通常、結果がキャッシュされるかどうか(この ClassLoader の場合)、または結果を毎回再取得する必要があるかどうかを確認するために使用されます。デフォルトの実装は常に false を返します。

      パラメーター:
      clazz - チェックするクラス (通常、この ClassLoader からロードされます)
      戻り値:
      後でクラスが(別の Class オブジェクトを使用して)再ロードされたバージョンに表示されると予想されるかどうか
    • getOriginalClassLoader

      default ClassLoaderSE getOriginalClassLoader()
      この SmartClassLoader の元の ClassLoader を返すか、自給自足の場合は現在のローダー自体を返す可能性があります。

      デフォルトの実装では、ローカル ClassLoader 参照がそのまま返されます。ベースアプリケーションクラスローダーからの影響を受けないクラスを一般的に処理するリロード可能または他の選択的にオーバーライドする ClassLoader の場合、これは、現在のローダーが派生した元の ClassLoader を返すように実装する必要があります(たとえば、return getParent(); を介して)。

      これは、ターゲットクラスが現在のクラスローダーで定義されていない場合に、特定のプロキシのクラスローダーを決定するために Spring の AOP フレームワークで特に使用されます。リロード可能なクラスローダーの場合、リロード可能なクラスローダー自体で定義されていない一般的なクラスをプロキシするための基本アプリケーションクラスローダーをお勧めします。

      戻り値:
      オリジナルの ClassLoader (デフォルトで同じ参照)
      導入:
      5.3.5
      関連事項:
    • publicDefineClass

      default ClassSE<?> publicDefineClass(StringSE name, byte[] b, @Nullable ProtectionDomainSE protectionDomain)
      このクラスローダーでカスタムクラス(通常は CGLIB プロキシクラス)を定義します。

      これは、伝統的にリフレクションを介して呼び出される ClassLoaderSE の保護された 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 - カスタム定義の試みが不可能な場合 (このインターフェースのデフォルトの実装によってスローされます)
      導入:
      5.3.4
      関連事項: