クラス java.lang.ClassLoader
全パッケージ  クラス階層  このパッケージ  前項目  次項目  インデックス

クラス java.lang.ClassLoader

java.lang.Object
   |
   +----java.lang.ClassLoader

public class ClassLoader
extends Object

ClassLoader は、Java のクラスを実行環境にロードする方法を定義するクラスローダの抽象クラスである。 ロード方法を何も指定しないときは、環境変数 CLASSPATH が指すディレクトリからファイルを読むことによって クラスをロードする (これはプラットフォーム依存である)。 このロード方法は、ClassLoader を必要としない。

しかし、クラスがファイルからロードされないこともある。 例えばネットワークなどからもロードすることができる。 ネットワークからロードされたクラスは、byte 配列である。 byte 配列をクラス記述子に変換することをシステムに知らせることに ClassLoader を利用できる。 これは、defineClass() メソッドを使ってシステムに知らされる。

defineClass() 機構を用いて作られたクラスは、他のクラスを名前で参照することができる。 システムは名前を解決するためにクラスを生成した ClassLoader を呼び出す。 参照するクラスをロードするために、システムは抽象メソッド loadClass() を呼び出す。

	ClassLoader loader = new NetworkClassLoader(host, port);
 	Object main = loader.loadClass("Main").newInstance();
	....

サブクラス NetworkClassLoader は、クラスをネットワークからロードするために loadClass() メソッドを必ず定義しなければならない。 NetworkClassLoader がクラスを作る byte 配列をダウンロードしたとき、 クラスのインスタンスを生成するために defineClass() メソッドを使うべきである。

実装例:
	class NetworkClassLoader {
	    String host;
	    int port;
	    Hashtable cache = new Hashtable();
	    private byte loadClassData(String name)[] {
		// load the class data from the connection
		...
	    }
	    public synchronized Class loadClass(String name) {
	        Class c = cache.get(name);
		if (c == null) {
		    byte data[] = loadClassData(name);
		    cache.put(name, defineClass(data, 0, data.length));
		}
		return c;
	    }
	}
参照:
Class

Constructor Index

 o ClassLoader()
ClassLoader を生成して初期化する。

Method Index

 o defineClass(byte[], int, int)
byte 配列を Class クラスのインスタンスに変換する。
 o findSystemClass(String)
システムクラスをロードする。
 o loadClass(String, boolean)
指定された名前をクラスとして解決する。
 o resolveClass(Class)
Class から参照されるクラスを解決する。

Constructors

 o ClassLoader
  protected ClassLoader()
ClassLoader を生成して初期化する。

Methods

 o loadClass
  protected abstract Class loadClass(String name,
                                     boolean resolve) throws ClassNotFoundException
指定された名前をクラスとして解決する。仮想マシンによって loadClass()メソッドが呼び出される。loadClass() は抽象メソッドであるから、ClassLoader のサブクラスでは必ず loadClass() メソッドを定義しなければならない。 Hashtable を使うことで同じクラスが 2 度以上ロードされることを防ぐことができる。
パラメータ:
name - 欲しいクラスの名前
resolve - クラスが解決される必要があるとき true
返り値:
結果のクラス、見付からないときは null
例外: ClassNotFoundException
クラスの定義が見付からない
参照:
Hashtable
 o defineClass
  protected final Class defineClass(byte data[],
                                    int offset,
                                    int length)
byte 配列を Class クラスのインスタンスに変換する。 Class を利用する前に呼ばれなければならない。
パラメータ:
data - Class を作るバイト列
offset - Class のデータが始まるオフセット
length - Class のデータの長さ
返り値:
データから作られた Class オブジェクト
例外: ClassFormatError
データが不正である
参照:
loadClass, resolveClass
 o resolveClass
  protected final void resolveClass(Class c)
Class から参照されるクラスを解決する。 これは Class を利用する前に行う必要がある。 結果の Class から参照されるクラス名は、loadClass() によって解決される。
パラメータ:
c - 解決したい Class
参照:
defineClass
 o findSystemClass
  protected final Class findSystemClass(String name) throws ClassNotFoundException
システムクラスをロードする。 システムクラスとは原始的な ClassLoader を使うクラスである。
パラメータ:
name - システムクラスの名前
例外: NoClassDefFoundError
Class が見付からない
例外: ClassNotFoundException
クラスの定義が見付からない

全パッケージ  クラス階層  このパッケージ  前項目  次項目  インデックス

本マニュアルに関する著作権および商標