目次 | 前の項目 | 次の項目 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 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 文字列のパスです。

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

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

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

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

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



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