全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス
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;
         }
     }
 
 
 ClassLoader()
	ClassLoader()
   
 defineClass(byte[], int, int)
	defineClass(byte[], int, int)
  Class のインスタンスに変換する。
推奨されない。
   defineClass(String, byte[], int, int)
	defineClass(String, byte[], int, int)
   findLoadedClass(String)
	findLoadedClass(String)
   findSystemClass(String)
	findSystemClass(String)
   getResource(String)
	getResource(String)
   getResourceAsStream(String)
	getResourceAsStream(String)
   getSystemResource(String)
	getSystemResource(String)
   getSystemResourceAsStream(String)
	getSystemResourceAsStream(String)
   loadClass(String)
	loadClass(String)
   loadClass(String, boolean)
	loadClass(String, boolean)
   resolveClass(Class)
	resolveClass(Class)
   setSigners(Class, Object[])
	setSigners(Class, Object[])
   
 ClassLoader
ClassLoader
protected ClassLoader()
セキュリティマネージャがある場合は、その checkCreateClassLoader メソッドが呼び出されます。これがセキュリティ例外になる場合があります。
 
 loadClass
loadClass
public Class loadClass(String name) throws ClassNotFoundException
loadClass メソッドを呼び出します。クラス ClassLoader のすべてのサブクラスは、このメソッドで定義する必要があります。
 
resolve フラグが true の場合、メソッドは結果クラスオブジェクトについて resolveClass メソッドを呼び出します。
 
同じ名前で何回もクラスが定義されないよう、クラスローダはハッシュテーブルまたは他のキャッシュを使う必要があります。
Class 名
    Class を 解決する必要がある場合は true
    Class、またはクラスが見つからなかった場合は null
      loadClass
loadClass
  protected abstract Class loadClass(String name,
                                     boolean resolve) throws ClassNotFoundException
 defineClass
defineClass
  protected final Class defineClass(byte data[],
                                    int offset,
                                    int length)
Class のインスタンスに変換します。最初にクラスを解決してからでなければ、クラスを使うことはできません。このメソッドよりも、「name (名前)」 を最初の引数として取るバージョンの方がお勧めですし、より安全です。
Class を作成するバイト
    Class データの開始オフセット
    Class データの長さ
    Class オブジェクト
     defineClass
defineClass
  protected final Class defineClass(String name,
                                    byte data[],
                                    int offset,
                                    int length)
Class を作成するバイト
    Class データの開始オフセット
    Class データの長さ
    Class オブジェクト
     resolveClass
resolveClass
protected final void resolveClass(Class c)
true の場合、このメソッドは loadClass で呼び出します。
Class インスタンス
     findSystemClass
findSystemClass
protected final Class findSystemClass(String name) throws ClassNotFoundException
システムクラスとは、プラットフォームから独立してローカルファイルシステムからロードしたクラスです。システムクラスにはクラスローダはありません。
クラス (class) 名
     setSigners
setSigners
  protected final void setSigners(Class cl,
                                  Object signers[])
 findLoadedClass
findLoadedClass
protected final Class findLoadedClass(String name)
 getSystemResourceAsStream
getSystemResourceAsStream
public static final InputStream getSystemResourceAsStream(String name)
リソース名には、任意のシステムリソース名を指定できます。(例えば、CLASSPATH 順に従います)。
 getSystemResource
getSystemResource
public static final URL getSystemResource(String name)
リソース名には、任意のシステムリソースを指定できます。(例えば、CLASSPATH 順に従います)。
 getResourceAsStream
getResourceAsStream
public InputStream getResourceAsStream(String name)
クラスローダは、リソースの検索で行うべきことを選択できます。
 getResource
getResource
public URL getResource(String name)
クラスローダは、リソースの検索で行うべきことを選択できます。
全パッケージ クラス階層 このパッケージ 前項目 次項目 インデックス