モジュール java.rmi
パッケージ java.rmi.server

クラスRMIClassLoader


  • public class RMIClassLoader
    extends Object
    RMIClassLoaderは、RMIを使用して動的にクラスをロードするためのstaticメソッドから構成されます。 このクラス・ローダーには、ネットワークの場所(1つ以上のURL)からクラスをロードするメソッドや、既存のクラスが格納されている場所を取得するメソッドが組み込まれています。 これらのメソッドは、リモート・メソッド呼出しの引数や戻り値に含まれるクラスを整列化および非整列化するときに、RMIランタイムによって使用されます。また、これらのメソッドをアプリケーションから直接呼び出して、クラスを動的にロードすることもできます。

    次のstaticメソッドの実装は、

    これらのサービス・プロバイダ・インタフェースRMIClassLoaderSpiのインスタンスによって提供されます。 このメソッドのいずれかが呼び出されると、その動作がサービス・プロバイダ・インスタンスの対応するメソッドに委譲されます。 各メソッドがプロバイダ・インスタンスに委譲する方法の詳細は、各メソッドのマニュアルを参照してください。

    サービス・プロバイダ・インスタンスは次のように選択されます。

    • システム・プロパティjava.rmi.server.RMIClassLoaderSpiが定義されている場合、その値が"default"のときは、getDefaultProviderInstance()メソッド呼出しの戻り値に指定されているプロバイダ・インスタンスが選択されます。このシステム・プロパティが"default"以外の値のときは、システム・クラス・ローダー(ClassLoader.getSystemClassLoader()を参照)がシステム・プロパティに指定されているクラスをロードでき、そのクラスをRMIClassLoaderSpiに割り当てることができ、引数のないpublicコンストラクタを持つ場合、プロバイダ・インスタンス作成時にそのコンストラクタが呼び出されます。 このシステム・プロパティが定義されている場合でも、これらの条件が満たされていない場合は、RMIClassLoaderの使用を試みるコードに対して、プロバイダ・インスタンスの取得に失敗したことを示す、特定できないErrorがスローされます。
    • META-INF/services/java.rmi.server.RMIClassLoaderSpiというリソースがシステム・クラス・ローダーから見える場合、そのリソースの内容はプロバイダ構成ファイルとして解釈され、そのファイルの最初に指定されているクラス名がプロバイダ・クラス名として使用されます。 システム・クラス・ローダーがその名前を持つクラスをロードでき、そのクラスをRMIClassLoaderSpiに割り当てることができ、引数のないpublicコンストラクタを持つ場合は、プロバイダ・インスタンス作成時にそのコンストラクタが呼び出されます。 そのリソースが見つかっても、記述されているようにプロバイダをインスタンス化できない場合は、RMIClassLoaderの使用を試みるコードに対して、プロバイダ・インスタンスの取得に失敗したことを示す、不明なErrorがスローされます。
    • それ以外の場合は、getDefaultProviderInstance()メソッド呼出しの戻り値に指定されているプロバイダ・インスタンスが選択されます。

    導入されたバージョン:
    1.1
    関連項目:
    RMIClassLoaderSpi
    • メソッドの詳細

      • loadClass

        @Deprecated
        public static Class<?> loadClass​(String name)
                                  throws MalformedURLException,
                                         ClassNotFoundException
        非推奨。
        loadClass(String,String)メソッドに置き換えられています
        指定されたnameを名前に持つクラスをロードします。

        このメソッドはloadClass(String,String)に処理を委譲します。このとき、nullが最初の引数として、nameが2つめの引数として渡されます。

        パラメータ:
        name - ロード対象クラスの名前
        戻り値:
        ロードされたクラスを表すClassオブジェクト
        例外:
        MalformedURLException - クラスのロード時に使用されたプロバイダ固有のURLが無効である場合
        ClassNotFoundException - クラスの定義がコード・ベースの場所になかった場合
        関連項目:
        loadClass(String,String)
      • loadClass

        public static Class<?> loadClass​(URL codebase,
                                         String name)
                                  throws MalformedURLException,
                                         ClassNotFoundException
        指定されたコード・ベースURLからクラスをロードします。 codebasenullの場合、このメソッドの動作はloadClass(String,String)nullcodebaseと所定のクラス名を指定した場合と同じになります。

        このメソッドは、プロバイダ・インスタンスのRMIClassLoaderSpi.loadClass(String,String,ClassLoader)メソッドに処理を委譲します。このとき、指定されたURLでURL.toString()を呼び出した結果(codebaseがnullの場合はnull)が最初の引数として、nameが2つめの引数として、nullが3つめの引数として渡されます。

        パラメータ:
        codebase - クラスのロード元のURL、またはnull
        name - ロード対象クラスの名前
        戻り値:
        ロードされたクラスを表すClassオブジェクト
        例外:
        MalformedURLException - codebasenullで、かつクラスのロード時に使用されたプロバイダ固有のURLが無効である場合
        ClassNotFoundException - クラスの定義が指定されたURLになかった場合
      • loadClass

        public static Class<?> loadClass​(String codebase,
                                         String name)
                                  throws MalformedURLException,
                                         ClassNotFoundException
        指定されたコード・ベースURLパスからクラスをロードします。

        このメソッドは、プロバイダ・インスタンスのRMIClassLoaderSpi.loadClass(String,String,ClassLoader)メソッドに処理を委譲します。このとき、codebaseが最初の引数として、nameが2つめの引数として、nullが3つめの引数として渡されます。

        パラメータ:
        codebase - クラスのロード元のURLのリスト(区切り文字はスペース)、またはnull
        name - ロード対象クラスの名前
        戻り値:
        ロードされたクラスを表すClassオブジェクト
        例外:
        MalformedURLException - codebasenull以外でかつ無効なURLを含んでいる場合、またはcodebasenullでかつクラスのロード時に使用されたプロバイダ固有URLが無効である場合
        ClassNotFoundException - クラスの定義が指定された場所になかった場合
        導入されたバージョン:
        1.2
      • loadClass

        public static Class<?> loadClass​(String codebase,
                                         String name,
                                         ClassLoader defaultLoader)
                                  throws MalformedURLException,
                                         ClassNotFoundException
        指定されたコード・ベースURLパスからクラスをロードします。指定されたローダーを使用することもできます。 プロバイダ実装の呼出し元が、状況に応じて使用すべき追加クラス・ローダー(呼出し元のスタック上のローダーなど)をプロバイダ実装に提供する場合に、このメソッドを使用します。 通常、プロバイダ実装は、指定されたdefaultLoaderを使用して指定されたクラスの解決を試みたあとで、コード・ベースURLパスからのクラスの解決を試みます。

        このメソッドは、プロバイダ・インスタンスのRMIClassLoaderSpi.loadClass(String,String,ClassLoader)メソッドに処理を委譲します。このとき、codebaseが最初の引数として、nameが2つめの引数として、defaultLoaderが3つめの引数として渡されます。

        パラメータ:
        codebase - クラスのロード元のURLのリスト(区切り文字はスペース)、またはnull
        name - ロード対象クラスの名前
        defaultLoader - 状況に応じて使用する追加クラス・ローダー、またはnull
        戻り値:
        ロードされたクラスを表すClassオブジェクト
        例外:
        MalformedURLException - codebasenull以外でかつ無効なURLを含んでいる場合、またはcodebasenullでかつクラスのロード時に使用されたプロバイダ固有URLが無効である場合
        ClassNotFoundException - クラスの定義が指定された場所になかった場合
        導入されたバージョン:
        1.4
      • loadProxyClass

        public static Class<?> loadProxyClass​(String codebase,
                                              String[] interfaces,
                                              ClassLoader defaultLoader)
                                       throws ClassNotFoundException,
                                              MalformedURLException
        指定された名前を持つインタフェース群を実装した動的プロキシ・クラス(Proxyを参照)を、指定されたコード・ベースURLパスからロードします。

        これらのインタフェースの解決は、指定されたcodebaseを使用してloadClass(String,String)メソッド経由でロードされるクラスと同様の方法で行われます。

        このメソッドは、プロバイダ・インスタンスのRMIClassLoaderSpi.loadProxyClass(String,String[],ClassLoader)メソッドに処理を委譲します。このとき、codebaseが最初の引数として、interfacesが2つめの引数として、defaultLoaderが3つめの引数として渡されます。

        パラメータ:
        codebase - クラスのロード元のURLのリスト(区切り文字はスペース)、またはnull
        interfaces - プロキシ・クラスが実装するインタフェースの名前
        defaultLoader - 状況に応じて使用する追加クラス・ローダー、またはnull
        戻り値:
        指定されたインタフェースを実装する動的プロキシ・クラス
        例外:
        MalformedURLException - codebasenull以外でかつ無効なURLを含んでいる場合、またはcodebasenullでかつクラスのロード時に使用されたプロバイダ固有URLが無効である場合
        ClassNotFoundException - 指定されたインタフェースの定義のいずれかが指定された場所に見つからない場合、または動的プロキシ・クラスの作成に失敗した場合(Proxy.getProxyClass(ClassLoader,Class[])が、指定されたインタフェース・リストに対してIllegalArgumentExceptionをスローしたときなど)
        導入されたバージョン:
        1.4
      • getClassLoader

        public static ClassLoader getClassLoader​(String codebase)
                                          throws MalformedURLException,
                                                 SecurityException
        指定されたコード・ベースURLパスからクラスをロードするクラス・ローダーを返します。

        返されるクラス・ローダーは、loadClass(String,String)メソッドが同じcodebase引数を指定してクラスをロードするときに使用するクラス・ローダーと同じです。

        このメソッドは、プロバイダ・インスタンスのRMIClassLoaderSpi.getClassLoader(String)メソッドに処理を委譲します。このとき、codebaseが引数として渡されます。

        セキュリティ・マネージャが存在する場合は、RuntimePermission("getClassLoader")アクセス権を使用してcheckPermissionメソッドが呼び出され、この結果SecurityExceptionになることがあります。 このメソッドのプロバイダ実装は、呼出し側コンテキストがコード・ベースURLパス内のすべてのURLに対するアクセス権を持っているかどうかについて、セキュリティ・チェックを行うこともあります。

        パラメータ:
        codebase - 返されるクラス・ローダーがロードするクラスが格納されているURLのリスト(区切り文字はスペース)、またはnull
        戻り値:
        指定されたコード・ベースURLパスからクラスをロードするクラス・ローダー
        例外:
        MalformedURLException - codebasenull以外でかつ無効なURLを含んでいる場合、またはcodebasenullでかつクラス・ローダーの識別に使用されたプロバイダ固有URLが無効である場合
        SecurityException - セキュリティ・マネージャが存在するときに、そのcheckPermissionメソッドが失敗した場合。または、呼出し側がコード・ベースURLパス内のすべてのURLに接続するアクセス権を持っていない場合
        導入されたバージョン:
        1.3
      • getClassAnnotation

        public static String getClassAnnotation​(Class<?> cl)
        クラス定義の位置を示す注釈文字列を返します。RMIはこれを使用して、指定されたクラスのオブジェクトの整列化を行う際に、クラス記述子に注釈を加えます。

        このメソッドは、プロバイダ・インスタンスのRMIClassLoaderSpi.getClassAnnotation(Class)メソッドに処理を委譲します。このとき、clが引数として渡されます。

        パラメータ:
        cl - 注釈を取得する対象のクラス
        戻り値:
        整列化時に指定されたクラスに注釈を加えるために使用される文字列、またはnull
        例外:
        NullPointerException - clnullである場合
        導入されたバージョン:
        1.2
      • getDefaultProviderInstance

        public static RMIClassLoaderSpi getDefaultProviderInstance()
        サービス・プロバイダ・インタフェースRMIClassLoaderSpiのデフォルト・プロバイダの正規インスタンスを返します。 システム・プロパティjava.rmi.server.RMIClassLoaderSpiが定義されていない場合、次に示すRMIClassLoaderのstaticメソッドは、 サービス・プロバイダ・インスタンスとしてデフォルト・プロバイダの正規インスタンスを使用します。

        セキュリティ・マネージャが存在する場合は、RuntimePermission("setFactory")アクセス権を使用してcheckPermissionメソッドが呼び出され、その結果SecurityExceptionになることがあります。

        デフォルトのサービス・プロバイダ・インスタンスはRMIClassLoaderSpiを次のように実装します。

        getClassAnnotationメソッドは、指定されたクラス定義のダウンロードにリモート側が使用するコード・ベースURLパスを表すStringを返します。 返される文字列の形式は、空白で区切られたURLのパスです。 返されるコード・ベースの文字列は、次に示すように、指定されたクラスに定義されているクラス・ローダーによって異なります。

        • 定義されているクラス・ローダーがシステム・クラス・ローダー(ClassLoader.getSystemClassLoader()を参照)、システム・クラス・ローダーの親(インストール済みの拡張クラスに使用されるローダーなど)、またはブートストラップ・クラス・ローダー(nullで表されることもある)の場合、java.rmi.server.codebaseプロパティの値(または以前にキャッシュされた値の可能性もある)が返されます。そのプロパティが設定されていない場合は、nullが返されます。

        • 定義されているクラス・ローダーがURLClassLoaderのインスタンスの場合、そのローダーのgetURLsメソッド呼び出しから返される、外部形式のURLのリスト(区切り文字はスペース)が返されます。 URLClassLoaderがこのプロバイダによって作成され、そのloadClassまたはloadProxyClassメソッドが使用される場合、関連するコード・ベース文字列を取得するためのアクセス権は必要ありません。 URLClassLoaderインスタンスがこのプロバイダ以外に作成され、セキュリティ・マネージャが存在する場合は、getURLsメソッドからURLが返されるたびに、openConnection().getPermission()呼出しによって返されたアクセス権を使用してセキュリティ・マネージャのcheckPermissionメソッドが呼び出されます。これらの呼出しのいずれかでSecurityExceptionまたはIOExceptionがスローされた場合、java.rmi.server.codebaseプロパティの値(または以前にキャッシュされた値の可能性もある)が返されます。そのプロパティが設定されていない場合は、nullが返されます。

        • 定義されているクラス・ローダーがURLClassLoaderのインスタンスではない場合、java.rmi.server.codebaseプロパティの値(または以前にキャッシュされた値の可能性もある)が返されます。そのプロパティが設定されていない場合は、nullが返されます。

        codebaseという名前のStringパラメータ(空白で区切られたURLのリスト)を取る、次に説明する各メソッド実装について、メソッドが呼び出されるたびに特定のコードベース・ローダーが関連付けられます。コードベース・ローダーは、codebase引数と現在のスレッドのコンテキスト・クラス・ローダー(Thread.getContextClassLoader()を参照)とを組み合わせて検索されます。 セキュリティ・マネージャが存在する場合、このプロバイダは、クラス・ローダー・インスタンスの内部表(少なくともURLClassLoaderのインスタンスを含む)を保持します。この表のキーは、親のクラス・ローダーとそのコード・ベースURLパス(URLの順序付きリスト)のペアです。 codebase引数がnullの場合、コード・ベースURLパスは、システム・プロパティjava.rmi.server.codebaseの値、以前のキャッシュされた値のいずれかになります。 あるコード・ベースURLパスがある特定のコンテキスト内で次のいずれかのメソッドの呼出しのcodebase引数として渡された場合、表内のローダーのうち、パスが指定されたコード・ベースURLパス、親が現在スレッドのコンテキスト・クラス・ローダーであるようなローダーが、コードベース・ローダーになります。 そのようなローダーが存在しない場合は、作成されて表に追加されます。 ただし、この表は、到達不可能なローダーとそのローダーに定義されているクラスがガベージ・コレクトされるように、ローダーへの強参照を保持しません。 セキュリティ・マネージャが存在しないときに信頼されないコードが仮想マシンに暗黙的にロードされないようにするために、セキュリティ・マネージャが設定されていない場合は、コードベース・ローダーは現在のスレッドのコンテキスト・クラス・ローダーになります(指定されたコード・ベースURLパスは無視され、リモート・クラスをロードできなくなる)。

        getClassLoaderメソッドは、指定されたコード・ベースURLパスのコードベース・ローダーを返します。 セキュリティ・マネージャが存在する場合、呼出し側コンテキストにコード・ベースURLパス内のすべてのURLに対するアクセス権がないときは、SecurityExceptionがスローされます。

        loadClassメソッドは、指定された名前を持つクラスのロードを次の方法で試みます。

        defaultLoader引数がnullでない場合は、まずdefaultLoaderを使用して、指定されたnameのクラスをロードしようとします。たとえば、次のように評価します。
             Class.forName(name, false, defaultLoader)
         
        クラスをdefaultLoaderからロードできた場合は、そのクラスが返されます。 ClassNotFoundException以外の例外がスローされた場合は、その例外が呼出し側にスローされます。

        次に、loadClassメソッドが、指定されたコード・ベースURLパスのコードベース・ローダーを使用して、指定されたnameのクラスのロードを試みます。 セキュリティ・マネージャが存在する場合、呼出し側コンテキストにはコード・ベースURLパス内のすべてのURLに対するアクセス権が必要です。アクセス権がない場合は、コードベース・ローダーの代わりに、現在のスレッドのコンテキスト・クラス・ローダーが使用されます。

        loadProxyClassメソッドは、次の方法で、指定されたインタフェースの動的プロキシ・クラスを返そうとします。

        defaultLoader引数がnull以外で、そのローダーを使用して、指定されたインタフェースをすべて解決できる場合

        • 解決されたインタフェースがすべてpublicの場合は、まずProxy.getProxyClassを使用して、コードベース・ローダーからそのインタフェースの動的プロキシ・クラスを取得しようとする。IllegalArgumentExceptionがスローされた場合は、defaultLoaderからそのインタフェースの動的プロキシ・クラスを取得しようとする。 どちらの場合もIllegalArgumentExceptionがスローされたときは、ClassNotFoundExceptionがスローされる。 ほかの例外がスローされた場合、その例外は呼出し側にスローされる
        • 解決されたインタフェースがpublic以外の場合、それらがすべて同じクラス・ローダーに定義されているときは、そのローダーからそのインタフェースの動的プロキシ・クラスを取得しようとする
        • 上記以外の場合は、LinkageErrorがスローされる(指定されたインタフェースをすべて実装するクラスはいずれのローダーにも定義できないため)

        指定されたすべてのインタフェースを、コードベース・ローダーを使用して解決できる場合

        • 解決されたインタフェースがすべてpublicの場合は、そのインタフェースの動的プロキシ・クラスをコードベース・ローダーから取得しようとする。 IllegalArgumentExceptionがスローされた場合は、ClassNotFoundExceptionがスローされる。
        • 解決されたインタフェースがpublic以外の場合、それらがすべて同じクラス・ローダーに定義されているときは、そのローダーからそのインタフェースの動的プロキシ・クラスを取得しようとする
        • 上記以外の場合は、LinkageErrorがスローされる(指定されたインタフェースをすべて実装するクラスはいずれのローダーにも定義できないため)

        それ以外の場合、解決できなかった指定インタフェースについて、ClassNotFoundExceptionがスローされます。

        戻り値:
        デフォルトのサービス・プロバイダの正規のインスタンス
        例外:
        SecurityException - セキュリティ・マネージャが存在する場合に、そのcheckPermissionメソッド呼出しに失敗したとき
        導入されたバージョン:
        1.4
      • getSecurityContext

        @Deprecated
        public static Object getSecurityContext​(ClassLoader loader)
        非推奨。
        代替はありません。 Java 2プラットフォームv1.2以降のRMIでは、クラス・ローダーのセキュリティ・コンテキストを取得するためにこのメソッドを使用しません。
        指定されたクラス・ローダーのセキュリティ・コンテキストを返します。
        パラメータ:
        loader - セキュリティ・コンテキストの取得元のクラス・ローダー
        戻り値:
        セキュリティ・コンテキスト
        関連項目:
        SecurityManager.getSecurityContext()