全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス
java.lang.Object | +----java.lang.ClassLoader
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; } }
protected ClassLoader()
protected abstract Class loadClass(String name, boolean resolve) throws ClassNotFoundException
protected final Class defineClass(byte data[], int offset, int length)
protected final void resolveClass(Class c)
protected final Class findSystemClass(String name) throws ClassNotFoundException
全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス