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

クラス java.lang.ClassLoader

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

public abstract class ClassLoader
extends Object
クラス ClassLoader は abstract クラスです。アプリケーションは、Java 仮想マシンが動的にクラスをロードするように拡張するため、ClassLoader のサブクラスを実装します。

通常、Java 仮想マシンは、プラットフォーム独立型のローカルファイルシステムからクラスをロードします。例えば、UNIX システムでは、CLASSPATH 環境変数が定義したディレクトリからクラスをロードします。

ただし、クラスから作成できないクラスもあります。このようなクラスは、ネットワークなどの他のソースから作成したり、アプリケーションが構築します。メソッド defineClass は、バイトの配列をクラス Class のインスタンスに変換します。新しく定義したクラスのインスタンスは、クラス ClassnewInstance を使って生成できます。

クラスローダで生成したオブジェクトのメソッドと構築子は、他のクラスを参照できます。参照するクラスを解決するために、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, newInstance, defineClass, loadClass, resolveClass

Constructor Index

 o ClassLoader()
新規クラスローダを構築して、これを初期化する。

Method Index

 o defineClass(byte[], int, int)
バイトの配列をクラス Class のインスタンスに変換する。 推奨されない。
 o defineClass(String, byte[], int, int)
バイトの配列をクラス Class のインスタンスに変換する。
 o findLoadedClass(String)
 o findSystemClass(String)
指定された名前を持つシステムクラスを検索し、必要に応じてロードする。
 o getResource(String)
指定された名前を持つリソースを検索する。
 o getResourceAsStream(String)
指定されたリソース上の InputStream をゲットする。
 o getSystemResource(String)
指定された名前を持つリソースを検索する。
 o getSystemResourceAsStream(String)
指定されたリソース上の InputStream をゲットする。
 o loadClass(String)
指定された名前を持つクラスをロードするようにクラスローダに要求する。
 o loadClass(String, boolean)
指定された名前を Class にする。
 o resolveClass(Class)
クラスを、クラスのインスタンスを生成したり、メソッドの 1 つを呼び出せるようにする。
 o setSigners(Class, Object[])
クラスの署名者を設定する。

Constructors

 o ClassLoader
  protected ClassLoader()
新規クラスローダを構築し、これを初期化します。

セキュリティマネージャがある場合は、その checkCreateClassLoader メソッドが呼び出されます。これがセキュリティ例外になる場合があります。

例外: SecurityException
現在のスレッドが、新規クラスローダの許可を持たない場合
参照:
SecurityException, checkCreateClassLoader

Methods

 o loadClass
  public Class loadClass(String name) throws ClassNotFoundException
指定された名前を持つクラスをロードするよう、クラスローダに要求します。クラスローダがロードしたクラスが最初に別のクラスを参照すると、Java 仮想マシンが loadClass メソッドを呼び出します。クラス ClassLoader のすべてのサブクラスは、このメソッドで定義する必要があります。

resolve フラグが true の場合、メソッドは結果クラスオブジェクトについて resolveClass メソッドを呼び出します。

同じ名前で何回もクラスが定義されないよう、クラスローダはハッシュテーブルまたは他のキャッシュを使う必要があります。

パラメータ:
name - 要求 Class
resolve - Class を 解決する必要がある場合は true
返り値:
結果 Class、またはクラスが見つからなかった場合は null
例外: ClassNotFoundException
クラスローダがクラス定義を見つけられない場合
 o loadClass
  protected abstract Class loadClass(String name,
                                     boolean resolve) throws ClassNotFoundException
指定された名前をクラスにします。メソッド loadClass() は仮想マシンによって呼び出されます。abstract メソッドであるので、loadClass() は ClassLoader のサブクラスで定義されなければいけません。ハッシュテーブルを使うと、同じ Class を複数ロードせずに済みます。

パラメータ:
name - 要求 Class 名
resolve - Class を解決する必要がある場合は true
返り値:
結果 Class、または見つからない場合は null
例外: ClassNotFoundException
クラスローダがクラス定義を見つけられない場合
参照:
Hashtable
 o defineClass
  protected final Class defineClass(byte data[],
                                    int offset,
                                    int length)
注意: defineClass() は推奨されません。 defineClass(java.lang.String, byte[], int, int) に置換されました。

バイトの配列をクラス Class のインスタンスに変換します。最初にクラスを解決してからでなければ、クラスを使うことはできません。このメソッドよりも、「name (名前)」 を最初の引数として取るバージョンの方がお勧めですし、より安全です。

パラメータ:
data - Class を作成するバイト
offset - Class データの開始オフセット
length - Class データの長さ
返り値:
データから生成された Class オブジェクト
例外: ClassFormatError
データが有効 Class を含まない場合
参照:
loadClass, resolveClass
 o defineClass
  protected final Class defineClass(String name,
                                    byte data[],
                                    int offset,
                                    int length)
バイトの配列をクラス Class のインスタンスに変換します。最初にクラスを解決してからでなければ、クラスを使うことはできません。

パラメータ:
name - クラスの予期名; 分からない場合は null; 区切り文字には '.' を使う。'/' ではない。トレーリング ".class" 接尾語は使わない。
data - Class を作成するバイト
offset - Class データの開始オフセット
length - Class データの長さ
返り値:
データから生成された Class オブジェクト
例外: ClassFormatError
データが有効 Class を含まない場合
参照:
loadClass, resolveClass
 o resolveClass
  protected final void resolveClass(Class c)
クラスを、クラスのインスタンスを生成したり、メソッドの 1 つを呼び出せるようにします。解決フラグが true の場合、このメソッドは loadClass で呼び出します。

パラメータ:
c - 解決する Class インスタンス
参照:
defineClass
 o findSystemClass
  protected final Class findSystemClass(String name) throws ClassNotFoundException
指定された名前を持つシステムクラスを検索し、必要に応じてロードします。

システムクラスとは、プラットフォームから独立してローカルファイルシステムからロードしたクラスです。システムクラスにはクラスローダはありません。

パラメータ:
name - システムクラス (class)
返り値:
指定された名前を持つシステムクラス
例外: ClassNotFoundException
クラス定義を 見つけられない場合
例外: NoClassDefFoundError
クラスが見つからない場合
 o setSigners
  protected final void setSigners(Class cl,
                                  Object signers[])
クラスの署名者を設定します。クラスを定義したあとで、signature-aware クラスのローディングコードを使って呼び出します。

 o findLoadedClass
  protected final Class findLoadedClass(String name)
 o getSystemResourceAsStream
 public static final InputStream getSystemResourceAsStream(String name)
指定されたリソース上の InputStream をゲットします。この名前を持つリソースが見つからない場合は、null を返します。

リソース名には、任意のシステムリソース名を指定できます。(例えば、CLASSPATH 順に従います)。

パラメータ:
name - 使用するリソース名
返り値:
リソースの InputStream、見つからない場合は null
 o getSystemResource
 public static final URL getSystemResource(String name)
指定された名前を持つリソースを検索します。返り値はリソースの URL です。URL 上で getContent() を実行すると、Image, AudioClip, または InputStream が返ります。

リソース名には、任意のシステムリソースを指定できます。(例えば、CLASSPATH 順に従います)。

パラメータ:
name - 使用するリソース名
返り値:
リソース上の URL、見つからない場合は null
 o getResourceAsStream
  public InputStream getResourceAsStream(String name)
指定されたリソース上の InputStream をゲットします。この名前を持つリソースがない場合は、null を返します。

クラスローダは、リソースの検索で行うべきことを選択できます。

パラメータ:
name - 使用するリソース名
返り値:
リソース上の InputStream、見つからない場合は null
 o getResource
  public URL getResource(String name)
指定された名前を持つリソースを検索します。返り値はリソースの URL です。URL 上で getContent() を実行すると、Image, an AudioClip, または an InputStream が返ります。

クラスローダは、リソースの検索で行うべきことを選択できます。

パラメータ:
name - 使用するリソース名
返り値:
リソース上の InputStream on the resource、見つからない場合は null

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