|
JavaTM 2 Platform Std. Ed. v1.3 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
java.lang.Object | +--java.lang.ClassLoader
ClassLoader クラスは抽象クラスです。クラスローダは、クラスのロードを担当するオブジェクトです。クラス名を指定すると、クラスの定義を構成するデータを見つけるか生成します。一般的な方法としては、名前をファイル名に変換して、ファイルシステムからその名前のクラスファイルを読み取ります。
各 Class オブジェクトは、その Class オブジェクトを定義した ClassLoader への参照を格納しています。
配列クラスの Class オブジェクトは、クラスローダによっては作成されず、Java Runtime の要求に応じて自動的に作成されます。配列クラスのクラスローダは、Class.getClassLoader() によって返され、その要素の型のクラスローダと同じになります。要素の型がプリミティブ型の場合には、配列クラスにクラスローダはありません。
アプリケーションは、Java Virtual Machine が動的にクラスをロードするように拡張するため、ClassLoader のサブクラスを実装します。
クラスローダは一般的に、セキュリティマネージャがセキュリティドメインを示すために使われます。
ClassLoader クラスは、委譲モデルを使ってクラスとリソースを探します。ClassLoader の各インスタンスは、関連する親クラスローダを持ちます。クラスまたはリソースを見つけるために呼び出されると、ClassLoader インスタンスはそれ自体でクラスまたはリソースの検索を試みる前に、その検索を親クラスに委譲します。ブートストラップクラスローダと呼ばれる Virtual Machine の組み込みクラスローダはそれ自体では親を持たず、ClassLoader インスタンスの親として動作します。
通常、Java Virtual Machine は、プラットフォームに依存しない方法でローカルファイルシステムからクラスをロードします。たとえば、UNIX システムでは、CLASSPATH 環境変数によって定義されたディレクトリからクラスをロードします。
ただし、ファイルから作成できないクラスもあります。このようなクラスは、ネットワークなどの他のソースから作成したり、アプリケーションが構築したりします。メソッド defineClass は、バイトの配列をクラス Class のインスタンスに変換します。新しく定義したクラスのインスタンスは、クラス Class の newInstance を使って生成できます。
クラスローダで作成したオブジェクトのメソッドとコンストラクタは、他のクラスを参照できます。参照するクラスを判定するために、Java Virtual Machine は、クラスを最初に作成したクラスローダの loadClass メソッドを呼び出します。
たとえば、アプリケーションはネットワーククラスローダを作成して、サーバからクラスファイルをダウンロードできます。コードは次のようになります。
ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();
. . .
ネットワーククラスローダのサブクラスは、ネットワークからクラスをロードするために findClass メソッドと loadClassData メソッドを定義しなければなりません。クラスを作成するバイトを一度ダウンロードしたら、メソッド defineClass を使ってインスタンスを生成する必要があります。実装の例を以下に示します。
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
. . .
}
}
Class,
Class.newInstance(),
defineClass(byte[], int, int),
loadClass(java.lang.String, boolean),
resolveClass(java.lang.Class)| コンストラクタの概要 | |
protected |
ClassLoader()
getSystemClassLoader() メソッドによって返された ClassLoader を親クラスローダとして使用し、新しいクラスローダを作成します。
|
protected |
ClassLoader(ClassLoader parent)
指定された親クラスローダを使って、委譲のために新しいクラスローダを作成します。 |
| メソッドの概要 | |
protected Class |
defineClass(byte[] b,
int off,
int len)
推奨されていません。 defineClass(java.lang.String, byte[], int, int) に置き換えられました。 |
protected Class |
defineClass(String name,
byte[] b,
int off,
int len)
byte の配列を Class クラスのインスタンスに変換します。 |
protected Class |
defineClass(String name,
byte[] b,
int off,
int len,
ProtectionDomain protectionDomain)
オプションの ProtectionDomain を使って、バイトの配列を Class クラスのインスタンスに変換します。 |
protected Package |
definePackage(String name,
String specTitle,
String specVersion,
String specVendor,
String implTitle,
String implVersion,
String implVendor,
URL sealBase)
この ClassLoader で名前を使ってパッケージを定義します。 |
protected Class |
findClass(String name)
指定されたクラスを探します。 |
protected String |
findLibrary(String libname)
ネイティブライブラリの絶対パス名を返します。 |
protected Class |
findLoadedClass(String name)
指定された名前を持つクラスがこのクラスローダによってすでにロードされている場合、そのクラスを探します。 |
protected URL |
findResource(String name)
指定された名前を持つリソースを探します。 |
protected Enumeration |
findResources(String name)
指定された名前を持つすべてのリソースを表す URL の Enumeration を返します。 |
protected Class |
findSystemClass(String name)
指定された名前を持つクラスを探して、必要に応じてロードします。 |
protected Package |
getPackage(String name)
このクラスローダかその上位オブジェクトのどれかによって定義された Package を返します。 |
protected Package[] |
getPackages()
このクラスローダとその上位オブジェクトによって定義されたすべての Package を返します。 |
ClassLoader |
getParent()
委譲のための親クラスローダを返します。 |
URL |
getResource(String name)
指定された名前を持つリソースを見つけます。 |
InputStream |
getResourceAsStream(String name)
指定されたリソースを読み込む入力ストリームを返します。 |
Enumeration |
getResources(String name)
指定された名前を持つすべてのリソースを探します。 |
static ClassLoader |
getSystemClassLoader()
委譲のためのシステムクラスローダを返します。 |
static URL |
getSystemResource(String name)
クラスをロードするために使用される検索パスから、指定された名前のリソースを探します。 |
static InputStream |
getSystemResourceAsStream(String name)
クラスをロードするのに使用される検索パスから、指定された名前のリソースを、読み込み用にオープンします。 |
static Enumeration |
getSystemResources(String name)
クラスをロードするために使用される検索パスから、指定された名前のすべてのリソースを探します。 |
Class |
loadClass(String name)
指定された名前を持つクラスをロードします。 |
protected Class |
loadClass(String name,
boolean resolve)
指定された名前を持つクラスをロードします。 |
protected void |
resolveClass(Class c)
指定されたクラスをリンクします。 |
protected void |
setSigners(Class c,
Object[] signers)
クラスの署名者を設定します。 |
| クラス java.lang.Object から継承したメソッド |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| コンストラクタの詳細 |
protected ClassLoader(ClassLoader parent)
セキュリティマネージャが存在する場合は、セキュリティマネージャの checkCreateClassLoader メソッドが呼び出されます。これによりセキュリティ例外が発生する場合があります。
parent - 親のクラスローダSecurityException - セキュリティマネージャが存在し、その checkCreateClassLoader メソッドが新しいクラスローダの作成を許可しない場合SecurityException,
SecurityManager.checkCreateClassLoader()protected ClassLoader()
getSystemClassLoader() メソッドによって返された ClassLoader を親クラスローダとして使用し、新しいクラスローダを作成します。
このコンストラクタは、新しく作成されるクラスローダのそれぞれに対して呼び出されます。ClassLoader クラスは抽象クラスなので、ClassLoader クラス自体の新しいインスタンスを生成することはできません。ただし、ClassLoader のサブクラスの各コンストラクタは、明示的または暗黙的、直接的または間接的にかかわらず、必然的にこのコンストラクタを呼び出します。
セキュリティマネージャが存在する場合は、セキュリティマネージャの checkCreateClassLoader メソッドが呼び出されます。これによりセキュリティ例外が発生する場合があります。
SecurityException - セキュリティマネージャが存在し、その checkCreateClassLoader メソッドが新しいクラスローダの作成を許可しない場合SecurityException,
SecurityManager.checkCreateClassLoader()| メソッドの詳細 |
public Class loadClass(String name)
throws ClassNotFoundException
loadClass(String, boolean) メソッドと同じ方法でクラスを検索します。Java Virtual Machine がこのメソッドを呼び出して、クラス参照を解決します。このメソッドを呼び出すことは、loadClass(name, false) を呼び出すことに相当します。name - クラスの名前Class オブジェクトClassNotFoundException - クラスが見つからなかった場合
protected Class loadClass(String name,
boolean resolve)
throws ClassNotFoundException
findLoadedClass(String) を呼び出して、クラスがすでにロードされたかどうかを確認する
loadClass メソッドを呼び出す。親が null の場合、Virtual Machine に組み込まれたクラスローダが代わりに呼び出す
findClass(String) メソッドを呼び出して、クラスを探す
resolve フラグが true のときには、このメソッドは見つかったクラスオブジェクトに対して resolveClass(Class) メソッドを呼び出します。
Java 2 SDK v1.2 以降は、ClassLoader のサブクラスが、このメソッドではなく findClass(String) をオーバーライドすることが推奨されています。
name - クラスの名前resolve - true の場合は、クラスを解釈処理するClass オブジェクトClassNotFoundException - クラスが見つからない場合
protected Class findClass(String name)
throws ClassNotFoundException
loadClass メソッドによって呼び出されます。デフォルトの実装は ClassNotFoundException をスローします。name - クラスの名前Class オブジェクトClassNotFoundException - クラスが見つからない場合
protected final Class defineClass(byte[] b,
int off,
int len)
throws ClassFormatError
Class クラスのインスタンスに変換します。最初にクラスを解決してからでなければ、クラスを使うことはできません。このメソッドよりも、クラス名を最初の引数として取得するバージョンの方が安全であるため、そのバージョンを使用することをお勧めします。b - クラスデータを構成する byte。off から off+len-1 までの位置にある byte は、Java Virtual Machine 仕様で定義される有効なクラスファイルの形式を持つoff - クラスデータの開始オフセットlen - クラスデータの長さClass オブジェクトClassFormatError - データが有効なクラスを含まなかった場合loadClass(java.lang.String, boolean),
resolveClass(java.lang.Class)
protected final Class defineClass(String name,
byte[] b,
int off,
int len)
throws ClassFormatError
Class クラスのインスタンスに変換します。最初にクラスを解決してからでなければ、クラスを使うことはできません。
このメソッドは、デフォルトの ProtectionDomain を、新しく定義されたクラスに割り当てます。ProtectionDomain は、Policy.getPolicy().getPermissions() への呼び出しが null,null の Codesource を使って行われたときに許可されるアクセス権を保持します。デフォルトのドメインは defineClass の最初の呼び出しで作成され、そのあとの呼び出しで再使用されます。
特定の ProtectionDomain をクラスに割り当てるには、ProtectionDomain をその引数の 1 つとしてとる defineClass メソッドを使います。
name - クラスの名前として期待するもの。不明な場合は null。区切り文字には「/」ではなく「.」を使う。クラス名のあとの接尾辞「.class」は付けないb - クラスデータを構成する byte。off から off+len-1 までの位置にある byte は、Java Virtual Machine 仕様で定義される有効なクラスファイルの形式を持つoff - クラスデータの開始オフセットlen - クラスデータの長さClass オブジェクトClassFormatError - データが有効なクラスを含まなかった場合IndexOutOfBoundsException - off または len のどちらかが負の場合、または off+len が b.length よりも大きい場合SecurityException - 証明書の個別セット、次に符号なしのこのクラスを使って署名されたクラスを含むパッケージに、このクラスを追加しようとする場合loadClass(java.lang.String, boolean),
resolveClass(java.lang.Class),
ProtectionDomain,
Policy,
CodeSource,
SecureClassLoader
protected final Class defineClass(String name,
byte[] b,
int off,
int len,
ProtectionDomain protectionDomain)
throws ClassFormatError
null の場合は、デフォルトのドメインが、defineClass(String,byte[],int,int) のドキュメントで指定されているとおりクラスに割り当てられています。最初にクラスを解決してからでなければ、クラスを使うことはできません。
パッケージで定義される最初のクラスは、そのパッケージ内で連続して定義されたすべてのクラスにある、証明書の正確なセットを判定します。クラスの証明書のセットは、クラスの ProtectionDomain 内の CodeSource から取得します。そのパッケージに追加されたクラスには同一の証明書のセットが含まれている必要があり、含まれていない場合は SecurityException がスローされます。name 引数が null の場合、この判別は実行されません。必ず、定義するクラスの名前をバイトとともに渡す必要があります。このようにして渡すと、定義するクラスは実際に考えたとおりのクラスになります。
java.* パッケージのすべてのクラスはブートストラップクラスローダでしか定義できないので、"java." で始まるクラス名を指定することはできません。
name - クラスの名前b - クラスバイトoff - クラスバイトの開始オフセットlen - クラスバイト長protectionDomain - このクラスの ProtectionDomainClass オブジェクトと、任意の ProtectionDomainClassFormatError - データが有効なクラスを含まなかった場合IndexOutOfBoundsException - off または len のどちらかが負の場合、または off+len が b.length よりも大きい場合SecurityException - このクラスよりも異なった証明書のセットによって署名されたクラスを含むパッケージにこのクラスを追加しようとした場合、またはクラス名が "Java." で始まる場合protected final void resolveClass(Class c)
c がすでにリンクされている場合、このメソッドは単に復帰します。そうでない場合、Java 言語仕様の「Execution」の章で説明しているように、クラスはリンクされます。c - リンクするクラスNullPointerException - c が null の場合defineClass(java.lang.String,byte[],int,int)
protected final Class findSystemClass(String name)
throws ClassNotFoundException
Java 2 SDK より前では、このメソッドはローカルファイルシステムからクラスをプラットフォームに依存した方法でロードし、関連したクラスローダのないクラスオブジェクトを返します。
Java 2 SDK v1.2 以降、このメソッドはシステムクラスローダ (getSystemClassLoader() を参照) を使ってクラスをロードします。返されるクラスオブジェクトは、そのクラスオブジェクトに関連した ClassLoader を持つことになります。ClassLoader のサブクラスは通常、このメソッドを呼び出す必要はありません。これは、ほとんどのクラスローダが findClass(String) だけをオーバーライドすればよいからです。
name - 検索されるクラスの名前name クラスの Class オブジェクトClassNotFoundException - クラスが見つからない場合ClassLoader(ClassLoader),
getParent()public final ClassLoader getParent()
null を使って、ブートストラップクラスローダを表す場合もあります。このメソッドは、このクラスローダの親がブートストラップクラスローダの場合に、そのような実装で null を返します。
セキュリティマネージャが存在する場合、呼び出し側のクラスローダが null でなく、このクラスローダの上位オブジェクトでもない場合は、このメソッドは RuntimePermission("getClassLoader") アクセス権を使ってセキュリティマネージャの checkPermission メソッドを呼び出すことによって、親クラスローダに問題なくアクセスできることを保証します。そうでない場合は、SecurityException がスローされます。
ClassLoaderSecurityException - セキュリティマネージャが存在し、その checkPermission メソッドがこのクラスローダの親クラスローダへのアクセスを許可しない場合SecurityManager.checkPermission(java.security.Permission),
RuntimePermission
protected final void setSigners(Class c,
Object[] signers)
c - Class オブジェクトsigners - クラスの署名者protected final Class findLoadedClass(String name)
name - クラス名Class オブジェクト。クラスがロードされていない場合は nullpublic URL getResource(String name)
リソースの名前は、「/」で区切られたパス名であり、これによってリソースが識別されます。
このメソッドは、まずリソースの親クラスローダを検索します。親が null の場合、Virtual Machine に組み込まれたクラスローダのパスが検索されます。それに失敗すると、このメソッドはリソースを見つけるために findResource を呼び出します。
name - リソース名nullfindResource(String)
public final Enumeration getResources(String name)
throws IOException
リソースの名前は、「/」で区切られたパス名であり、これによってリソースが識別されます。
検索順については、getResource(String) のドキュメントを参照してください。
name - リソース名IOException - 入出力エラーが発生した場合getResource(java.lang.String),
findResources(java.lang.String)
protected Enumeration findResources(String name)
throws IOException
name - リソース名IOException - 入出力エラーが発生した場合protected URL findResource(String name)
name - リソース名nullpublic static URL getSystemResource(String name)
JDK 1.1 では、使用される検索パスは Virtual Machine の組み込みクラスローダの検索パスです。
Java 2 SDK v1.2 以降は、このメソッドはシステムクラスローダ (getSystemClassLoader() を参照) を使ってリソースを見つけます。
name - リソース名null
public static Enumeration getSystemResources(String name)
throws IOException
URL オブジェクトの Enumeration として返されます。
検索順については、getSystemResource(String) のドキュメントを参照してください。
name - リソース名IOException - 入出力エラーが発生した場合public InputStream getResourceAsStream(String name)
getResource(String) のドキュメントを参照してください。
name - リソース名nullpublic static InputStream getSystemResourceAsStream(String name)
検索順については、getSystemResource(String) のドキュメントを参照してください。
name - リソース名nullpublic static ClassLoader getSystemClassLoader()
ClassLoader インスタンスのデフォルトの委譲の親で、通常、アプリケーションを起動するためのクラスローダです。
セキュリティマネージャが存在する場合、呼び出し側のクラスローダが null でなく、このシステムクラスローダと同じでなく、このシステムクラスローダの上位オブジェクトでもなければ、このメソッドは RuntimePermission("getClassLoader") アクセス権を使ってセキュリティマネージャの checkPermission メソッドを呼び出すことによって、システムクラスローダに問題なくアクセスできることを保証します。そうでない場合は、SecurityException がスローされます。
ClassLoader。ない場合は nullSecurityException - セキュリティマネージャが存在し、その checkPermission メソッドがこのシステムクラスローダへのアクセスを許可しない場合SecurityManager.checkPermission(java.security.Permission),
RuntimePermission
protected Package definePackage(String name,
String specTitle,
String specVersion,
String specVendor,
String implTitle,
String implVersion,
String implVendor,
URL sealBase)
throws IllegalArgumentException
name - パッケージ名specTitle - 仕様のタイトルspecVersion - 仕様のバージョンspecVendor - 仕様のベンダーimplTitle - 実装のタイトルimplVersion - 実装のバージョンimplVendor - 実装のベンダーsealBase - null でない場合、このパッケージは指定されたコードソース URL を考慮してシールされる。そうでない場合、パッケージはシールされないPackage オブジェクトIllegalArgumentException - パッケージ名が、このクラスローダかまたはその上位オブジェクトのうちの 1 つに存在するパッケージと重複する場合protected Package getPackage(String name)
name - パッケージ名protected Package[] getPackages()
ClassLoader によって定義された Package オブジェクトの配列protected String findLibrary(String libname)
null を返す場合、VM は java.library.path プロパティで指定されたパスにしたがってライブラリを検索します。libname - ライブラリ名System.loadLibrary(java.lang.String),
System.mapLibraryName(java.lang.String)
|
JavaTM 2 Platform Std. Ed. v1.3 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
Java、Java 2D、JDBC は、米国およびその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2000 Sun Microsystems, Inc. 901 San Antonio Road,
Palo Alto, California, 94303, U.S.A. All Rights Reserved.