|
JavaTM 2 Platform Std. Ed. v1.4.0 |
||||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object | +--java.rmi.server.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
がスローされる
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)
指定された名前のインタフェースをコードベース URL パスから実装する動的プロキシクラス ( Proxy を参照) をロードします。 |
クラス java.lang.Object から継承したメソッド |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
メソッドの詳細 |
public static Class loadClass(String name) throws MalformedURLException, ClassNotFoundException
loadClass(String,String)
メソッドに置き換えられました。
java.rmi.server.codebase
プロパティに指定されているコードベース URL パスからクラスをロードします。
このメソッドは loadClass(String,String)
に委譲されます。1 つ目の引数には null
が、2 つ目の引数には name
が渡されます。
name
- ロード対象クラスの名前
Class
オブジェクト
MalformedURLException
- システムプロパティ java.rmi.server.codebase
に、無効な 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 (codebase
が null の場合は null
) で URL.toString()
を呼び出した結果が最初の引数として、name
が 2 つ目の引数として、および null
が 3 つ目の引数として渡されます。
codebase
- クラスのロード元の URL、または null
name
- ロード対象クラスの名前
Class
オブジェクト
MalformedURLException
- codebase
が null
で、システムプロパティ java.rmi.server.codebase
に無効な URL が指定されている場合
ClassNotFoundException
- クラスの定義が指定された URL になかった場合public static Class loadClass(String codebase, String name) throws MalformedURLException, ClassNotFoundException
codebase
が null
の場合は、システムプロパティ java.rmi.server.codebase
の値が URL パスとして使用されます。
このメソッドは、プロバイダのインスタンスの RMIClassLoaderSpi.loadClass(String,String,ClassLoader)
メソッドに委譲されます。このとき、codebase
が最初の引数として、name
が 2 つ目の引数として、および null
が 3 つ目の引数として渡されます。
codebase
- クラスのロード元の URL のリスト (区切り文字はスペース)、または null
name
- ロード対象クラスの名前
Class
オブジェクト
MalformedURLException
- codebase
が null
ではなく、無効な URL が含まれる場合。または codebase
が null
で、システムプロパティ java.rmi.server.codebase
に無効な URL が含まれる場合
ClassNotFoundException
- クラスの定義が指定された場所になかった場合public static Class loadClass(String codebase, String name, ClassLoader defaultLoader) throws MalformedURLException, ClassNotFoundException
codebase
が null
の場合は、システムプロパティ java.rmi.server.codebase
の値が URL パスとして使用されます。このメソッドは、プロバイダの実装の呼び出し側が、呼び出し側にスタックされているローダなど、状況に応じてクラスローダを選択できるようにするときに使用します。プロバイダの実装は通常、defaultLoader
(指定されている場合) を使用して指定されたクラスを解決してから、コードベース URL パスのクラスを解決しようとします。
このメソッドは、プロバイダのインスタンスの RMIClassLoaderSpi.loadClass(String,String,ClassLoader)
メソッドに委譲されます。このとき、codebase
が最初の引数として、name
が 2 つ目の引数として、および defaultLoader
が 3 つ目の引数として渡されます。
codebase
- クラスのロード元の URL のリスト (区切り文字はスペース)、または null
name
- ロード対象クラスの名前defaultLoader
- 状況に応じて使用する追加クラスローダ、または null
Class
オブジェクト
MalformedURLException
- codebase
が null
ではなく、無効な URL が含まれる場合。または codebase
が null
で、システムプロパティ java.rmi.server.codebase
に無効な URL が含まれる場合
ClassNotFoundException
- クラスの定義が指定された場所になかった場合public static Class loadProxyClass(String codebase, String[] interfaces, ClassLoader defaultLoader) throws ClassNotFoundException, MalformedURLException
Proxy
を参照) をロードします。codebase
が null
の場合、システムプロパティ java.rmi.server.codebase
の値が URL パスとして使用されます。
ロードしたインタフェースは、指定された codebase
を使用して、loadClass(String,String)
メソッドによってロードされたクラスと同様に解決されます。
このメソッドは、プロバイダのインスタンスの RMIClassLoaderSpi.loadProxyClass(String,String[],ClassLoader)
メソッドに委譲されます。このとき、codebase
が最初の引数として、interfaces
が 2 つ目の引数として、および defaultLoader
が 3 つ目の引数として渡されます。
codebase
- クラスのロード元の URL のリスト (区切り文字はスペース)、または null
interfaces
- プロキシクラスが実装するインタフェースの名前defaultLoader
- 状況に応じて使用する追加クラスローダ、または null
MalformedURLException
- codebase
が null
ではなく、無効な URL が含まれる場合。または codebase
が null
で、システムプロパティ java.rmi.server.codebase
に無効な 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
で、システムプロパティ java.rmi.server.codebase
に無効な URL が含まれる場合
SecurityException
- セキュリティマネージャが存在するときに、その checkPermission
メソッドが失敗した場合。または、呼び出し側がコードベース URL パス内のすべての URL に対するアクセス権を持っていない場合public static String getClassAnnotation(Class cl)
このメソッドは、プロバイダインスタンスの RMIClassLoaderSpi.getClassAnnotation(Class)
メソッドに委譲され、このとき cl
が引数として渡されます。
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 のリスト) を指定して次に説明するメソッド実装を呼び出すと、関連付けられた「コードベースローダ」と現在のスレッドのコンテキストクラスローダ (Thread.getContextClassLoader()
を参照) が返されます。コードベースローダは、codebase
引数によって識別されます。セキュリティマネージャが存在する場合、このプロバイダにはクラスローダのインスタンス (URLClassLoader
のインスタンスなど) の内部テーブルが関連付けられます。このテーブルのキーは、親のクラスローダとコードベース URL パス (URL 順のリスト) のペアです。指定されたコードベース URL パスが指定されたコンテキストにcodebase
引数として渡され、次のいずれかのメソッドが呼び出されると、このテーブル内の指定されたコードベース URL パスを持つコードベースローダと、現在のスレッドのコンテキストクラスローダがその親として返されます。条件を満たすローダがない場合は、ローダが新しく作成され、テーブルに追加されます。このテーブルに含まれるローダには、強参照は保持されません。このため、到達不可能なローダとそのローダに定義されているクラスはガベージコレクトされます。セキュリティマネージャが存在しないときに信頼されないコードが仮想マシンに暗黙的にロードされないようにするために、セキュリティマネージャが設定されていない場合は、コードベースローダは現在のスレッドのコンテキストクラスローダになります (指定されたコードベース URL パスは無視され、リモートクラスをロードできなくなります)。
getClassLoader
メソッドは、指定されたコードベース URL パスのコードベースローダを返します。セキュリティマネージャが存在する場合、呼び出し側コンテキストにコードベース URL パス内のすべての URL に対するアクセス権がないときは、SecurityException
がスローされます。
loadClass
メソッドは、指定された名前のクラスを次の方法でロードしようとします。defaultLoader
引数がnull
でない場合は、まずdefaultLoader
を使用して、指定されたname
のクラスをロードしようとします。たとえば、次のように評価します。Class.forName(name, false, defaultLoader)クラスをdefaultLoader
からロードできた場合、そのクラスが返されます。ClassNotFoundException
以外の例外がスローされた場合は、その例外が呼び出し側にスローされます。次に、
loadClass
メソッドが、指定されたコードベース URL パスのコードベースローダを使用して、指定されたname
のクラスをロードしようとします。codebase
の文字列に複数の URL を指定するときは、スペースで区切ってください。セキュリティマネージャが存在する場合、呼び出し側コンテキストにはコードベース URL パス内のすべての URL に対するアクセス権が必要です。アクセス権がない場合は、コードベースローダの代わりに、現在のスレッドのコンテキストクラスローダが使用されます。
loadProxyClass
メソッドは、次の方法で、指定されたインタフェースの動的プロキシクラスを返そうとします。
defaultLoader
引数がnull
以外で、そのローダを使用して指定されたインタフェースをすべて解決できる場合
- 解決されたインタフェースがすべて
public
の場合は、まずProxy.getProxyClass
を使用して、コードベースローダからそのインタフェースの動的プロキシクラスを取得しようとする。IllegalArgumentException
がスローされた場合は、defaultLoader
からそのインタフェースの動的プロキシクラスを取得しようとする。どちらの場合もIllegalArgumentException
がスローされたときは、ClassNotFoundException
がスローされる。ほかの例外がスローされた場合、その例外は呼び出し側にスローされる- 解決されたインタフェースが
public
以外の場合、それらがすべて同じクラスローダに定義されているときは、そのローダからそのインタフェースの動的プロキシクラスを取得しようとする- 上記以外の場合は、
LinkageError
がスローされる (指定されたインタフェースをすべて実装するクラスはいずれのローダにも定義できないため)指定されたすべてのインタフェースをコードベースローダを使用して解決できる場合
- 解決されたインタフェースがすべて
public
の場合は、そのインタフェースの動的プロキシクラスをコードベースローダから取得しようする。IllegalArgumentException
がスローされた場合は、ClassNotFoundException
がスローされる- 解決されたインタフェースが
public
以外の場合、それらがすべて同じクラスローダに定義されているときは、そのローダからそのインタフェースの動的プロキシクラスを取得しようとする- 上記以外の場合は、
LinkageError
がスローされる (指定されたインタフェースをすべて実装するクラスはいずれのローダにも定義できないため)上記以外の場合、解決できなかった指定インタフェースについて、
ClassNotFoundException
がスローされます。
SecurityException
- セキュリティマネージャが存在する場合に、その checkPermission
メソッド呼び出しに失敗したときpublic static Object getSecurityContext(ClassLoader loader)
loader
- セキュリティコンテキストの取得元のクラスローダ
SecurityManager.getSecurityContext()
|
JavaTM 2 Platform Std. Ed. v1.4.0 |
||||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Java、Java 2D、および JDBC は米国ならびにその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2002 Sun Microsystems, Inc. 901 San Antonio Road
Palo Alto, California, 94303, U.S.A. All Rights Reserved.