|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
java.lang.Objectjava.rmi.server.RMIClassLoader
public class RMIClassLoader
RMIClassLoader は、RMI を使用して動的にクラスをロードするための static メソッドから構成されます。このクラスローダには、ネットワークの場所 (1 つ以上の URL) からクラスをロードするメソッドや、既存のクラスが格納されている場所を取得するメソッドが組み込まれています。これらのメソッドは、リモートメソッド呼び出しの引数や戻り値に含まれるクラスを整列化および非整列化するときに、RMI ランタイムによって使用されます。また、これらのメソッドをアプリケーションから直接呼び出して、クラスを動的にロードすることもできます。
次の static メソッドの実装は、サービスプロバイダインタフェース RMIClassLoaderSpi のインスタンスによって提供されます。
loadClass(URL,String) loadClass(String,String) loadClass(String,String,ClassLoader) loadProxyClass(String,String[],ClassLoader) getClassLoader(String) getClassAnnotation(Class)
サービスプロバイダインスタンスは次のように選択されます。
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() メソッド呼び出しの戻り値に指定されているプロバイダインスタンスが選択される
RMIClassLoaderSpi| メソッドの概要 | |
|---|---|
static String |
getClassAnnotation(Class<?> cl)
クラス定義の位置を示す注釈文字列を返します。 |
static ClassLoader |
getClassLoader(String codebase)
指定されたコードベース URL パスからクラスをロードするクラスローダを返します。 |
static RMIClassLoaderSpi |
getDefaultProviderInstance()
サービスプロバイダインタフェース RMIClassLoaderSpi のデフォルトプロバイダの標準インスタンスを返します。 |
static Object |
getSecurityContext(ClassLoader loader)
推奨されていません。 代替はありません。Java 2 プラットフォーム 1.2 以降の RMI では、クラスローダのセキュリティコンテキストを取得するためにこのメソッドを使用しません。 |
static Class<?> |
loadClass(String name)
推奨されていません。 loadClass(String,String) メソッドに置き換えられました。 |
static Class<?> |
loadClass(String codebase,
String name)
指定されたコードベース URL パスからクラスをロードします。 |
static Class<?> |
loadClass(String codebase,
String name,
ClassLoader defaultLoader)
指定されたコードベース URL パスからクラスをロードします。 |
static Class<?> |
loadClass(URL codebase,
String name)
指定されたコードベース URL からクラスをロードします。 |
static Class<?> |
loadProxyClass(String codebase,
String[] interfaces,
ClassLoader defaultLoader)
指定された名前を持つインタフェース群を実装した動的プロキシクラス ( Proxy を参照) を、指定されたコードベース URL パスからロードします。 |
| クラス java.lang.Object から継承されたメソッド |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| メソッドの詳細 |
|---|
@Deprecated
public static Class<?> loadClass(String name)
throws MalformedURLException,
ClassNotFoundException
loadClass(String,String) メソッドに置き換えられました。
name を名前に持つクラスをロードします。
このメソッドは処理を loadClass(String,String) メソッドに委譲します。1 つ目の引数には null が、2 つ目の引数には name が渡されます。
name - ロード対象クラスの名前
Class オブジェクト
MalformedURLException - クラスロード時に使用されたプロバイダ固有 URL が無効である場合
ClassNotFoundException - クラスの定義がコードベースの位置になかった場合loadClass(String,String)
public static Class<?> loadClass(URL codebase,
String name)
throws MalformedURLException,
ClassNotFoundException
codebase が null である場合、このメソッドの動作は、メソッド loadClass(String,String) の引数に null codebase と同一クラス名を指定した場合と同じになります。
このメソッドは、プロバイダインスタンスの RMIClassLoaderSpi.loadClass(String,String,ClassLoader) メソッドに処理を委譲します。このとき、指定した URL で URL.toString() を呼び出した結果 (codebase が null の場合は null) が最初の引数として、name が 2 つ目の引数として、null が 3 つ目の引数として渡されます。
codebase - クラスのロード元の URL、または nullname - ロード対象クラスの名前
Class オブジェクト
MalformedURLException - codebase が null で、かつクラスロード時に使用されたプロバイダ固有 URL が無効である場合
ClassNotFoundException - クラスの定義が指定された URL になかった場合
public static Class<?> loadClass(String codebase,
String name)
throws MalformedURLException,
ClassNotFoundException
このメソッドは、プロバイダインスタンスの RMIClassLoaderSpi.loadClass(String,String,ClassLoader) メソッドに処理を委譲します。このとき、codebase が最初の引数として、name が 2 つ目の引数として、null が 3 つ目の引数として渡されます。
codebase - クラスのロード元の URL のリスト (区切り文字はスペース)、または nullname - ロード対象クラスの名前
Class オブジェクト
MalformedURLException - codebase が null 以外でかつ無効な URL を含んでいる場合、または codebase が null でかつクラスロード時に使用されたプロバイダ固有 URL が無効である場合
ClassNotFoundException - クラスの定義が指定された場所になかった場合
public static Class<?> loadClass(String codebase,
String name,
ClassLoader defaultLoader)
throws MalformedURLException,
ClassNotFoundException
defaultLoader を使用して指定されたクラスの解決を試みてから、コードベース URL パスからのクラスの解決を試みます。
このメソッドは、プロバイダインスタンスの RMIClassLoaderSpi.loadClass(String,String,ClassLoader) メソッドに処理を委譲します。このとき、codebase が最初の引数として、name が 2 つ目の引数として、defaultLoader が 3 つ目の引数として渡されます。
codebase - クラスのロード元の URL のリスト (区切り文字はスペース)、または nullname - ロード対象クラスの名前defaultLoader - 状況に応じて使用する追加クラスローダ、または null
Class オブジェクト
MalformedURLException - codebase が null 以外でかつ無効な URL を含んでいる場合、または codebase が null でかつクラスロード時に使用されたプロバイダ固有 URL が無効である場合
ClassNotFoundException - クラスの定義が指定された場所になかった場合
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 のリスト (区切り文字はスペース)、または nullinterfaces - プロキシクラスが実装するインタフェースの名前defaultLoader - 状況に応じて使用する追加クラスローダ、または null
MalformedURLException - codebase が null 以外でかつ無効な URL を含んでいる場合、または codebase が null でかつクラスロード時に使用されたプロバイダ固有 URL が無効である場合
ClassNotFoundException - 指定されたインタフェースの定義のいずれかが指定された場所に見つからない場合、または動的プロキシクラスの作成に失敗した場合 (Proxy.getProxyClass(ClassLoader,Class[]) が、指定されたインタフェースリストに対して IllegalArgumentException をスローしたときなど)
public static ClassLoader getClassLoader(String codebase)
throws MalformedURLException,
SecurityException
返されるクラスローダは、loadClass(String,String) メソッドが同じ codebase 引数を指定してクラスをロードするときに使用するクラスローダと同じです。
このメソッドは、プロバイダインスタンスの RMIClassLoaderSpi.getClassLoader(String) メソッドに処理を委譲します。このとき、codebase が引数として渡されます。
セキュリティマネージャが存在する場合は、RuntimePermission("getClassLoader") アクセス権を使用して checkPermission メソッドが呼び出され、SecurityException がチェックされます。このメソッドのプロバイダ実装は、呼び出し側コンテキストがコードベース URL パス内のすべての URL に対するアクセス権を持っているかどうかについて、セキュリティチェックを行うこともあります。
codebase - 返されるクラスローダがロードするクラスが格納されている URL のリスト (区切り文字はスペース)、または null
MalformedURLException - codebase が null 以外でかつ無効な URL を含んでいる場合、または codebase が null でかつクラスローダの識別時に使用されたプロバイダ固有 URL が無効である場合
SecurityException - セキュリティマネージャが存在するときに、その checkPermission メソッドが失敗した場合。または、呼び出し側がコードベース URL パス内のすべての URL に対するアクセス権を持っていない場合public static String getClassAnnotation(Class<?> cl)
このメソッドは、プロバイダインスタンスの RMIClassLoaderSpi.getClassAnnotation(Class) メソッドに処理を委譲します。このとき、cl が引数として渡されます。
cl - 注釈を取得する対象のクラス
null
NullPointerException - cl が null の場合public static RMIClassLoaderSpi getDefaultProviderInstance()
RMIClassLoaderSpi のデフォルトプロバイダの標準インスタンスを返します。システムプロパティ java.rmi.server.RMIClassLoaderSpi が定義されていない場合、次に示す RMIClassLoader の static メソッドは、サービスプロバイダインスタンスとしてデフォルトプロバイダの標準インスタンスを使用します。
loadClass(URL,String) loadClass(String,String) loadClass(String,String,ClassLoader) loadProxyClass(String,String[],ClassLoader) getClassLoader(String) getClassAnnotation(Class)
セキュリティマネージャが存在する場合、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 メソッド呼び出しに失敗したとき@Deprecated public static Object getSecurityContext(ClassLoader loader)
loader - セキュリティコンテキストの取得元のクラスローダ
SecurityManager.getSecurityContext()
|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。