目次 | 前の項目 | 次の項目 Java Remote Method Invocation


5.6 RMIClassLoader クラス

java.rmi.server.RMIClassLoader クラスは、RMI でネットワークベースのクラスのロードをサポートする、一連の public かつ static のユーティリティメソッドを提供します。これらのメソッドは、RMI 内部の整列化ストリームによって呼び出され、RMI パラメータおよび戻り値の型のクラスを動的にロードしますが、RMI でのクラスのロードの動作を真似るために、アプリケーションから直接呼び出されることもあります。RMIClassLoader クラスには、パブリックにアクセス可能なコンストラクタがないため、インスタンスを生成できません。

package java.rmi.server;

public class RMIClassLoader {
	public static String getClassAnnotation(Class cl);
	public static ClassLoader getClassLoader(String codebase)
	    throws java.net.MalformedURLException, SecurityException;
	public static Object getSecurityContext(ClassLoader loader);
	public static Class loadClass(String name)
	    throws java.net.MalformedURLException, 
		   ClassNotFoundException;
	public static Class loadClass(String codebase, String name)
	    throws java.net.MalformedURLException, 
		   ClassNotFoundException;
    	public static Class loadClass(URL codebase, String name) 
	    throws java.net.MalformedURLException, 
		   ClassNotFoundException;
}
getClassAnnotation メソッドは、ネットワークのコードベースパスを表す String を返します。 このコードベースパスは、指定されたクラスの定義をダウンロードするためにリモートエンドポイントが使用します。RMI ランタイムは、getClassAnnotation メソッドから返された String オブジェクトを、整列化ストリーム内のクラス記述子の注釈として使います。このコードベース文字列の形式は、スペースで区切ったコードベース URL 文字列のパスです。

提供されたクラスのクラスローダに応じて、次のようにコードベース文字列が返されます。

  - 「システムクラスローダ」 (アプリケーションの「クラスパス」にクラスをロードするために使用され、ClassLoader.getSystemClassLoader メソッドから返されるクラスローダ)
  - インストール型拡張機能用のクラスローダなどの「システムクラスローダ」の親
  - null (JVM クラスのロード用の「ブートクラスローダ」)

getClassLoader メソッドは、所定のコードベース URL パス (スペースで区切られた URL のリスト) からクラスをロードするクラスローダを返します。そのクラスローダは、loadClass(String,String) メソッドが特定のコードベースからクラスをロードするために使用するものです。同じコードベース URL パスを持つクラスローダがすでに RMI ランタイムに存在する場合は、そのクラスローダが返されます。 存在しない場合は、新しいクラスローダが作成されます。コードベースが null である場合、そのコードベースは loadClass(String) メソッドによりクラスをロードするのに使用するクラスローダを返します。コードベースパラメータが null ではない不正な URL を含んでいる場合、このメソッドは MalformedURLException をスローします。 また、呼び出し側にコードベース URL パス内のすべての URL に接続するためのアクセス権がない場合は、SecurityException をスローします。

getSecurityContext メソッドは、JDK 1.1 でクラスローダベースのセキュリティチェックを実装するために内部で使用されていましたが、Java 2 プラットフォームのセキュリティモデルには適用されなくなったため、現在では推奨されません。RMIClassLoader.loadClass メソッドの 1 つを呼び出すサービスを提供するために、指定されたクラスローダが RMI ランタイムによって作成された場合は、クラスローダのコードパス内の最初の URL が返されます。 それ以外の場合は、null が返されます。

3 つの loadClass メソッドは、どれも現在のスレッドのコンテキストクラスローダを使って、指定された名前を持つクラスをロードしようとします。 セキュリティマネージャのセットがある場合は、特定のコードベースパスの内部 URLClassLoader (メソッドによって異なる) が使われます。

どの loadClass メソッドについても、現在のスレッド上で getContextClassLoader を呼び出すことによって決定される現在のスレッドのコンテキストクラスローダとコードベースパスを使って、クラスのロード元とする内部クラスローダのインスタンスが決定されます。RMI ランタイムは、親クラスローダとローダのコードベースパス (順序付けられた URL リスト) で構成されるペアがキーとなる内部クラスローダのインスタンスのテーブルを保持します。loadClass メソッドは、目的のコードベースパスと、現在のスレッドのコンテキストクラスローダを親として持つ URLClassLoader のインスタンスを検索します。そのようなローダが存在しない場合は、作成されてテーブルに追加されます。最後に、指定されたクラス名を使って、選択されたクラスローダ上で loadClass メソッドが呼び出されます。

セキュリティマネージャのセットがある (System.getSecurityManagernull を返さない) 場合は、loadClass の呼び出し側に、コードベースパス内のすべての URL に接続可能なアクセス権が必要です。 そのようなアクセス権がない場合は、ClassNotFoundException がスローされます。セキュリティマネージャがない JVM に信頼のおけない任意のコードがロードされることを防ぐため、セキュリティマネージャのセットがない場合は、どの loadClass メソッドも特定のコードベースパスを無視し、現在のスレッドのコンテキストクラスローダから指定された「名前」を持つクラスだけをロードしようとします。



目次 | 前の項目 | 次の項目
Copyright © 1997-1999 Sun Microsystems, Inc. All Rights Reserved.