|
JavaTM 2 Platform Std. Ed. v1.4.0 |
||||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | ||||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | ||||||||||
java.lang.Object | +--java.lang.ClassLoader
クラスローダは、クラスのロードを担当するオブジェクトです。ClassLoader クラスは抽象クラスです。クラス名を指定すると、クラスローダはクラスの定義を構成するデータを見つけるか生成します。一般的な方法としては、名前をファイル名に変換して、ファイルシステムからその名前のクラスファイルを読み込みます。
各 Class オブジェクトは、その Class オブジェクトを定義した ClassLoader への 参照 を格納しています。
配列クラスの Class オブジェクトは、クラスローダによっては作成されず、Java Runtime の要求に応じて自動的に作成されます。配列クラスのクラスローダは、Class.getClassLoader() によって返され、その要素の型のクラスローダと同じになります。要素の型がプリミティブ型の場合には、配列クラスにクラスローダはありません。
アプリケーションは、Java 仮想マシンが動的にクラスをロードするように拡張するため、ClassLoader のサブクラスを実装します。
クラスローダは一般的に、セキュリティマネージャがセキュリティドメインを示すために使われます。
ClassLoader クラスは、委譲モデルを使ってクラスとリソースを探します。ClassLoader の各インスタンスは、関連する親クラスローダを持ちます。クラスまたはリソースを見つけるために呼び出されると、ClassLoader インスタンスはそれ自体でクラスまたはリソースの検索を試みる前に、その検索を親クラスに委譲します。ブートストラップクラスローダと呼ばれる仮想マシンの組み込みクラスローダはそれ自体では親を持たず、ClassLoader インスタンスの親として動作します。
通常、Java 仮想マシンは、プラットフォームに依存しない方法でローカルファイルシステムからクラスをロードします。たとえば、UNIX システムでは、CLASSPATH 環境変数によって定義されたディレクトリからクラスをロードします。
ただし、ファイルから作成できないクラスもあります。このようなクラスは、ネットワークなどの他のソースから作成したり、アプリケーションが構築したりします。メソッド defineClass は、バイトの配列をクラス Class のインスタンスに変換します。新しく定義したクラスのインスタンスは、クラス Class の newInstance を使って生成できます。
クラスローダで作成したオブジェクトのメソッドとコンストラクタは、他のクラスを参照できます。参照するクラスを判定するために、Java 仮想マシンは、クラスを最初に作成したクラスローダの 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)
指定された親クラスローダを使って、委譲のために新しいクラスローダを作成します。 |
| メソッドの概要 | |
void |
clearAssertionStatus()
このクラスローダのデフォルト宣言ステータスを false に設定し、クラスローダに関連付けられたデフォルトパッケージおよびクラス宣言ステータス設定をすべて破棄します。 |
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)
指定されたクラスをリンクします。 |
void |
setClassAssertionStatus(String className,
boolean enabled)
このクラスローダおよび内部の入れ子構造クラス内の名前付きのトップレベルクラスに対して、目的の宣言ステータスを設定します。 |
void |
setDefaultAssertionStatus(boolean enabled)
このクラスローダのデフォルト宣言ステータスを設定します。 |
void |
setPackageAssertionStatus(String packageName,
boolean enabled)
名前付きパッケージのデフォルト宣言ステータスを設定します。 |
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 仮想マシンがこのメソッドを呼び出して、クラス参照を解決します。このメソッドを呼び出すことは、loadClass(name, false) を呼び出すことに相当します。
name - クラスの名前
Class オブジェクト
ClassNotFoundException - クラスが見つからなかった場合
protected Class loadClass(String name,
boolean resolve)
throws ClassNotFoundException
findLoadedClass(String) を呼び出して、クラスがすでにロードされたかどうかを確認する
loadClass メソッドを呼び出す。親が null の場合、仮想マシンに組み込まれたクラスローダが代わりに呼び出す
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 仮想マシン仕様で定義される有効なクラスファイルの形式を持つoff - クラスデータの b 内の開始オフセットlen - クラスデータの長さ
Class オブジェクト
ClassFormatError - データが有効なクラスを含まなかった場合
IndexOutOfBoundsException - off または len のどちらかが負の場合、または off+len が b.length よりも大きい場合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 のコードソースを使って行われたときに許可されるアクセス権を保持します。デフォルトのドメインは defineClass の最初の呼び出しで作成され、そのあとの呼び出しで再使用されます。
特定の ProtectionDomain をクラスに割り当てるには、ProtectionDomain をその引数の 1 つとしてとる defineClass メソッドを使います。
name - クラスの名前として期待するもの。不明な場合は null。区切り文字には「/」ではなく「.」を使う。クラス名のあとの接尾辞「.class」は付けないb - クラスデータを構成する byte。off から off+len-1 までの位置にある byte は、Java 仮想マシン仕様で定義される有効なクラスファイルの形式を持つoff - クラスデータの b 内の開始オフセットlen - クラスデータの長さ
Class オブジェクト
ClassFormatError - データが有効なクラスを含まなかった場合
IndexOutOfBoundsException - off または len のどちらかが負の場合、または off+len が b.length よりも大きい場合
SecurityException - このクラスとは異なる証明書セット (符号なし) を使って署名されたクラスを含むパッケージに、このクラスを追加しようとする場合、またはクラス名が「java.」で始まる場合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." で始まるクラス名を指定することはできません。名前パラメータは、null ではない場合には、バイト配列 b で指定されたクラスの名前に等しくなければなりません。等しくない場合、ClassFormatError がスローされます。
name - クラスの名前として期待するもの。不明な場合は null。区切り文字には「/」ではなく「.」を使う。クラス名のあとの接尾辞「.class」は付けないb - クラスデータを構成する byte。off から off+len-1 までの位置にある byte は、Java 仮想マシン仕様で定義される有効なクラスファイルの形式を持つoff - クラスデータの b 内の開始オフセットlen - クラスデータの長さprotectionDomain - このクラスの ProtectionDomain
Class オブジェクトと、任意の ProtectionDomain
ClassFormatError - データが有効なクラスを含まなかった場合
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 がスローされます。
ClassLoader
SecurityException - セキュリティマネージャが存在し、その 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 の場合、仮想マシンに組み込まれたクラスローダのパスが検索されます。それに失敗すると、このメソッドはリソースを見つけるために 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 では、使用される検索パスは仮想マシンの組み込みクラスローダの検索パスです。
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 インスタンスのデフォルトの委譲の親で、通常、アプリケーションを起動するためのクラスローダです。
このメソッドが最初に呼び出されるのは、実行時の起動シーケンスの初期です。この時点で、メソッドはシステムクラスローダを作成し、呼び出す Thread のコンテキストクラスローダにそれを設定します。
デフォルトのシステムクラスローダは、このクラスの実装依存インスタンスです。
このメソッドの最初の呼び出し時に、システムプロパティ java.system.class.loader が定義される場合、このプロパティの値がシステムクラスローダとして返されるクラスの名前になります。このクラスは、デフォルトのシステムクラスローダを使用してロードされます。また、このクラスは、委譲の親として使用される、ClassLoader 型の単一のパラメータを取る public コンストラクタを定義する必要があります。次に、このコンストラクタを使用し、デフォルトのシステムクラスローダをパラメータに指定して、インスタンスが作成されます。作成されたクラスローダは、システムクラスローダとして定義されます。
セキュリティマネージャが存在する場合、呼び出し側のクラスローダが null でなく、このシステムクラスローダと同じでなく、このシステムクラスローダの上位オブジェクトでもなければ、このメソッドは RuntimePermission("getClassLoader") アクセス権を使ってセキュリティマネージャの checkPermission メソッドを呼び出すことによって、システムクラスローダに問題なくアクセスできることを保証します。そうでない場合は、SecurityException がスローされます。
ClassLoader。ない場合は null
SecurityException - セキュリティマネージャが存在し、その checkPermission メソッドがこのシステムクラスローダへのアクセスを許可しない場合
IllegalStateException - java.system.class.loader プロパティにより指定されたクラスローダの構築時に、再帰的に呼び出される場合
Error - システムプロパティ java.system.class.loader は定義されるが、名前付きクラスをロードできない場合、プロバイダクラスは必須コンストラクタを定義しないか、その呼び出し時に例外がスローされる。エラーの根本原因は、Throwable.getCause() メソッドを使用して取得できる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)public void setDefaultAssertionStatus(boolean enabled)
setPackageAssertionStatus(String,boolean) または setClassAssertionStatus(String,boolean) を呼び出すことで、この設定をパッケージまたはクラス単位でオーバーライドできます。
enabled - このクラスローダによりロードされるクラスの宣言が、デフォルトで有効な場合は true、デフォルトで無効な場合は false
public void setPackageAssertionStatus(String packageName,
boolean enabled)
p という名前のパッケージのサブパッケージは、すべて名前が「p.」で始まります。たとえば、javax.swing.text は javax.swing のサブパッケージです。また、java.util と java.lang.reflect はどちらも、java のサブパッケージです。
1 つのクラスに複数のデフォルトパッケージ適用される場合には、そのクラスに最も関連性の高いデフォルトパッケージが、他のパッケージに優先して使用されます。たとえば、javax.lang と javax.lang.reflect がどちらも関連付けられたデフォルトパッケージを保持する場合、後者のデフォルトパッケージは javax.lang.reflect 内のクラスに適用されます。
デフォルトパッケージは、クラスローダのデフォルト宣言ステータスよりも優先されます。ただし、setClassAssertionStatus(String,boolean) を呼び出すことで、クラス単位でオーバーライドできます。
packageName - パッケージデフォルト宣言ステータスを設定するパッケージ名。null 値は、"current" の無名パッケージであることを示す (JLS 7.4.2)enabled - このクラスローダによりロードされ、名前付きパッケージまたはそのサブパッケージのどれかに属するクラスが、デフォルトで有効な宣言を保持する場合は true、デフォルトで無効な宣言を保持する場合は false
public void setClassAssertionStatus(String className,
boolean enabled)
名前付きクラスがトップレベルのクラスではない場合、この呼び出しは、どのようなクラスの宣言ステータスに対しても影響を与えません。戻り値は未定義になります。
className - 宣言ステータスを設定するトップレベルのクラスの完全修飾クラス名enabled - 初期化時に、名前付きクラスで宣言を有効にする場合は true、宣言を無効にする場合は falsepublic void clearAssertionStatus()
|
JavaTM 2 Platform Std. Ed. v1.4.0 |
||||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | ||||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | ||||||||||
Java、Java 2D、および JDBC は米国ならびにその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2002 Sun Microsystems, Inc. 901 San Antonio Road
Palo Alto, California, 94303, U.S.A. All Rights Reserved.