全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス
java.lang.Object | +----java.lang.ClassLoader
ClassLoader
は abstract クラスです。アプリケーションは、Java 仮想マシンが動的にクラスをロードするように拡張するため、ClassLoader
のサブクラスを実装します。
通常、Java 仮想マシンは、プラットフォーム独立型のローカルファイルシステムからクラスをロードします。例えば、UNIX システムでは、CLASSPATH
環境変数が定義したディレクトリからクラスをロードします。
ただし、クラスから作成できないクラスもあります。このようなクラスは、ネットワークなどの他のソースから作成したり、アプリケーションが構築します。メソッド defineClass
は、バイトの配列をクラス Class
のインスタンスに変換します。新しく定義したクラスのインスタンスは、クラス Class
の newInstance
を使って生成できます。
クラスローダで生成したオブジェクトのメソッドと構築子は、他のクラスを参照できます。参照するクラスを解決するために、Java 仮想マシンはクラスを最初に生成したクラスローダの loadClass
メソッドを呼び出します。Java 仮想マシンが判別する必要がある事項が、クラスが存在するか、および存在する場合にスーパークラスを認識するかということだけの場合は、resolve
フラグが false
に設定されます。ただし、クラスのインスタンスを生成中の場合や、任意のメソッドを呼び出し中の場合は、クラスも解決する必要があります。この場合、resolve
フラグは true
に設定され、resolveClass
メソッドが呼び出されます。
例えば、アプリケーションはネットワーククラスローダを生成して、サーバーからクラスファイルをダウンロードできます。サンプルコードは以下のようになります:
ClassLoader loader = new NetworkClassLoader(host, port); Object main = loader.loadClass("Main", true).newInstance(); . . .
ネットワークローダサブクラスがクラスをネットワークからロードするには、メソッド loadClass
を定義する必要があります。クラスを作成するバイトを一度ダウンロードしたら、メソッド defineClass
を使ってインスタンス A を生成します。以下は、この実装サンプルです:
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, boolean resolve) { Class c = cache.get(name); if (c == null) { byte data[] = loadClassData(name); c = defineClass(data, 0, data.length); cache.put(name, c); } if (resolve) resolveClass(c); return c; } }
Class
のインスタンスに変換する。
推奨されない。
protected ClassLoader()
セキュリティマネージャがある場合は、その checkCreateClassLoader
メソッドが呼び出されます。これがセキュリティ例外になる場合があります。
public Class loadClass(String name) throws ClassNotFoundException
loadClass
メソッドを呼び出します。クラス ClassLoader
のすべてのサブクラスは、このメソッドで定義する必要があります。
resolve
フラグが true の場合、メソッドは結果クラスオブジェクトについて resolveClass
メソッドを呼び出します。
同じ名前で何回もクラスが定義されないよう、クラスローダはハッシュテーブルまたは他のキャッシュを使う必要があります。
Class
名
Class
を 解決する必要がある場合は true
Class
、またはクラスが見つからなかった場合は null
protected abstract Class loadClass(String name, boolean resolve) throws ClassNotFoundException
protected final Class defineClass(byte data[], int offset, int length)
Class
のインスタンスに変換します。最初にクラスを解決してからでなければ、クラスを使うことはできません。このメソッドよりも、「name (名前)」 を最初の引数として取るバージョンの方がお勧めですし、より安全です。
Class
を作成するバイト
Class
データの開始オフセット
Class
データの長さ
Class
オブジェクト
protected final Class defineClass(String name, byte data[], int offset, int length)
Class
を作成するバイト
Class
データの開始オフセット
Class
データの長さ
Class
オブジェクト
protected final void resolveClass(Class c)
true
の場合、このメソッドは loadClass
で呼び出します。
Class
インスタンス
protected final Class findSystemClass(String name) throws ClassNotFoundException
システムクラスとは、プラットフォームから独立してローカルファイルシステムからロードしたクラスです。システムクラスにはクラスローダはありません。
クラス (class)
名
protected final void setSigners(Class cl, Object signers[])
protected final Class findLoadedClass(String name)
public static final InputStream getSystemResourceAsStream(String name)
リソース名には、任意のシステムリソース名を指定できます。(例えば、CLASSPATH 順に従います)。
public static final URL getSystemResource(String name)
リソース名には、任意のシステムリソースを指定できます。(例えば、CLASSPATH 順に従います)。
public InputStream getResourceAsStream(String name)
クラスローダは、リソースの検索で行うべきことを選択できます。
public URL getResource(String name)
クラスローダは、リソースの検索で行うべきことを選択できます。
全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス