|
Foundation 1.1.2 | |||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
java.lang.Objectjava.lang.ClassLoader
public abstract class ClassLoader
クラスローダーは、クラスのロードを担当するオブジェクトです。ClassLoader クラスは abstract クラスです。クラスの名前を指定すると、クラスローダーはクラスの定義を構成するデータを見つけるか生成します。一般的な方法としては、名前をファイル名に変換して、ファイルシステムからその名前の「クラスファイル」を読み込みます。
各 Class オブジェクトは、そのオブジェクトを定義した ClassLoader への reference を格納しています。
配列クラスの 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
. . .
}
}
resolveClass(Class)| コンストラクタの概要 | |
|---|---|
protected |
ClassLoader()
getSystemClassLoader() メソッドによって返された ClassLoader を親クラスローダーとして使用し、新しいクラスローダーを作成します。 |
protected |
ClassLoader(ClassLoader parent)
指定された親クラスローダーを使って、委譲のために新しいクラスローダーを作成します。 |
| メソッドの概要 | |
|---|---|
void |
clearAssertionStatus()
このクラスローダーのデフォルト宣言ステータスを false に設定し、クラスローダーに関連付けられたデフォルトパッケージおよびクラス宣言ステータス設定をすべて破棄します。 |
protected Class |
defineClass(String name,
byte[] b,
int off,
int len)
バイトの配列を 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)
このローダーがこの名前を持つクラスの起動ローダーとして Java 仮想マシンにより記録されていた場合は、指定された名前を持つクラスを返します。 |
protected URL |
findResource(String name)
指定された名前を持つリソースを検索します。 |
protected Enumeration |
findResources(String name)
指定された名前を持つすべてのリソースを表す URL オブジェクトの列挙を返します。 |
protected Class |
findSystemClass(String name)
指定された名前を持つクラスを探して、必要に応じてロードします。 |
protected Package |
getPackage(String name)
このクラスローダーかその上位オブジェクトのどれかによって定義された Package を返します。 |
protected Package[] |
getPackages()
このクラスローダーとその上位オブジェクトによって定義されたすべての Packages を返します。 |
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)
指定された name を名前に持つクラスをロードします。 |
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 メソッドが新しいクラスローダーの作成を許可しない場合protected ClassLoader()
getSystemClassLoader() メソッドによって返された ClassLoader を親クラスローダーとして使用し、新しいクラスローダーを作成します。
セキュリティーマネージャーが存在する場合は、セキュリティーマネージャーの checkCreateClassLoader メソッドが呼び出されます。これはセキュリティー例外となる場合があります。
SecurityException - セキュリティーマネージャーが存在し、その checkCreateClassLoader メソッドが新しいクラスローダーの作成を許可しない場合| メソッドの詳細 |
|---|
public Class loadClass(String name)
throws ClassNotFoundException
loadClass(String, boolean) メソッドと同じ方法でクラスを検索します。Java 仮想マシンがこのメソッドを呼び出して、クラス参照を解決します。このメソッドを呼び出すことは、loadClass(name, false) を呼び出すことに相当します。
name - クラスの名前
ClassNotFoundException - クラスが見つからなかった場合
protected Class loadClass(String name,
boolean resolve)
throws ClassNotFoundException
findLoadedClass(String) を呼び出して、クラスがすでにロードされたかどうかを確認する
親クラスローダーで loadClass メソッドを呼び出す。親が null の場合、仮想マシンに組み込まれたクラスローダーが代わりに呼び出す
findClass(String) メソッドを呼び出して、クラスを探す
上記の手順でクラスが見つかった場合、resolve フラグが true のときには、このメソッドは結果として得られる Class オブジェクトに対して resolveClass(Class) メソッドを呼び出します。
ClassLoader のサブクラスが、このメソッドではなく findClass(String) をオーバーライドすることが推奨されています。
name - クラスの名前resolve - true の場合は、クラスを解釈処理する
ClassNotFoundException - クラスが見つからない場合
protected Class findClass(String name)
throws ClassNotFoundException
loadClass メソッドによって呼び出されます。デフォルトの実装は ClassNotFoundException をスローします。
name - クラスの名前
ClassNotFoundException - クラスが見つからない場合
protected final Class defineClass(String name,
byte[] b,
int off,
int len)
throws ClassFormatError
このメソッドは、デフォルトの ProtectionDomain を、新しく定義されたクラスに割り当てます。ProtectionDomain は、Policy.getPolicy().getPermissions(new CodeSource(null, null)) が呼び出されたときに返されるアクセス権と同じアクセス権を保持します。デフォルトのドメインは defineClass の最初の呼び出しで作成され、そのあとの呼び出しで再使用されます。
特定の ProtectionDomain をクラスに割り当てるには、ProtectionDomain をその引数の 1 つとして取る defineClass メソッドを使います。
name - クラスの名前として期待するもの。不明な場合は null。区切り文字には「/」ではなく「.」を使う。クラス名のあとの接尾辞「.class」は付けないb - クラスデータを構成するバイト。off から off+len-1 までの位置にある byte は、Java 仮想マシン仕様で定義される有効なクラスファイルの形式を持つoff - クラスデータの b の開始オフセットlen - クラスデータの長さ
ClassFormatError - データが有効なクラスを含まなかった場合
IndexOutOfBoundsException - off または len のどちらかが負の場合、または off+len が b.length よりも大きい場合
SecurityException - このクラスとは異なる証明書セット (符号なし) を使って署名されたクラスを含むパッケージに、このクラスを追加しようとする場合、またはクラス名が「java.」で始まる場合loadClass(String, boolean),
resolveClass(Class),
CodeSource,
SecureClassLoader
protected final Class defineClass(String name,
byte[] b,
int off,
int len,
ProtectionDomain protectionDomain)
throws ClassFormatError
defineClass(String, byte[], int, int) のドキュメントで指定されているとおりクラスに割り当てられています。最初にクラスを解決してからでなければ、クラスを使用することはできません。
パッケージで定義される最初のクラスは、そのパッケージ内で連続して定義されたすべてのクラスにある、証明書の正確なセットを判定します。クラスの証明書のセットは、クラスの ProtectionDomain 内の CodeSource から取得します。そのパッケージに追加されたクラスには同一の証明書のセットが含まれている必要があり、含まれていない場合は SecurityException がスローされます。name 引数が null の場合、この判別は実行されません。必ず、定義するクラスの名前をバイトとともに渡す必要があります。このようにして渡すと、定義するクラスは実際に考えたとおりのクラスになります。
java.* パッケージのすべてのクラスはブートストラップクラスローダーでしか定義できないので、「java.」で始まるクラス名を指定することはできません。name パラメータが null ではない場合には、バイト配列「b」で指定されたクラスの名前に等しくなければいけません。等しくない場合、NoClassDefFoundError がスローされます。
name - クラスの名前として期待するもの。不明な場合は null。区切り文字には「/」ではなく「.」を使う。クラス名のあとの接尾辞「.class」は付けないb - クラスデータを構成するバイト。off から off+len-1 までの位置にある byte は、Java 仮想マシン仕様で定義される有効なクラスファイルの形式を持つoff - クラスデータの b の開始オフセットlen - クラスデータの長さprotectionDomain - このクラスの ProtectionDomain
ClassFormatError - データが有効なクラスを含まなかった場合
NoClassDefFoundError - name が b で指定されたクラスの名前と等しくない場合
IndexOutOfBoundsException - off または len のどちらかが負の場合、または off+len が b.length よりも大きい場合
SecurityException - このクラスとは異なる証明書セットを使って署名されたクラスを含むパッケージに、このクラスを追加しようとする場合、またはクラス名が「java.」で始まる場合protected final void resolveClass(Class c)
c - リンクするクラス
NullPointerException - c が null の場合defineClass(String, byte[], int, int)
protected final Class findSystemClass(String name)
throws ClassNotFoundException
このメソッドはシステムクラスローダー (getSystemClassLoader() を参照) を使ってクラスをロードします。返される Class オブジェクトは、そのクラスオブジェクトに関連した ClassLoader を 1 つ以上持つことになります。ClassLoader のサブクラスは通常、このメソッドを呼び出す必要はありません。 これは、ほとんどのクラスローダーが findClass(String) だけをオーバーライドすればよいからです。
name - 検索されるクラスの名前
ClassNotFoundException - クラスが見つからない場合ClassLoader(ClassLoader),
getParent()protected final Class findLoadedClass(String name)
name - クラス名
protected final void setSigners(Class c,
Object[] signers)
c - Class オブジェクトsigners - クラスの署名者public URL getResource(String name)
リソースの名前は、「/」で区切られたパス名であり、これによってリソースが識別されます。
このメソッドは、まずリソースの親クラスローダーを検索します。 親が null の場合、仮想マシンに組み込まれたクラスローダーのパスが検索されます。それに失敗すると、このメソッドはリソースを見つけるために findResource(String) を呼び出します。
name - リソース名
public final Enumeration getResources(String name)
throws IOException
リソースの名前は、「/」で区切られたパス名であり、これによってリソースが識別されます。
検索順については、getResource(String) のドキュメントを参照してください。
name - リソース名
URL オブジェクトの列挙。リソースが見つからなかった場合、列挙は空になる。クラスローダーがアクセスを持たないリソースは列挙に入らない
IOException - 入出力エラーが発生した場合findResources(String)protected URL findResource(String name)
name - リソース名
protected Enumeration findResources(String name)
throws IOException
URL オブジェクトの列挙を返します。クラスローダーの実装は、リソースのロード元を特定するためにこのメソッドをオーバーライドします。
name - リソース名
URL オブジェクトの列挙
IOException - 入出力エラーが発生した場合public static URL getSystemResource(String name)
getSystemClassLoader() を参照) を使ってリソースを見つけます。
name - リソース名
URL オブジェクト。リソースが見つからなかった場合は null
public static Enumeration getSystemResources(String name)
throws IOException
URL オブジェクトの Enumeration として返されます。
検索順については、getSystemResource(String) のドキュメントを参照してください。
name - リソース名
URL オブジェクトの列挙
IOException - 入出力エラーが発生した場合public InputStream getResourceAsStream(String name)
検索順については、getResource(String) のドキュメントを参照してください。
name - リソース名
public static InputStream getSystemResourceAsStream(String name)
getSystemClassLoader() を参照) を使ってリソースを見つけます。
name - リソース名
public final ClassLoader getParent()
セキュリティーマネージャーが存在する場合、呼び出し側のクラスローダーが null でなく、このクラスローダーの上位オブジェクトでもない場合は、このメソッドは RuntimePermission("getClassLoader") アクセス権を使ってセキュリティーマネージャーの checkPermission メソッドを呼び出すことによって、親クラスローダーに問題なくアクセスできることを保証します。そうでない場合は、SecurityException がスローされます。
SecurityException - セキュリティーマネージャーが存在し、その checkPermission メソッドがこのクラスローダーの親クラスローダーへのアクセスを許可しない場合public static ClassLoader getSystemClassLoader()
このメソッドが最初に呼び出されるのは、実行時の起動シーケンスの初期です。この時点で、メソッドはシステムクラスローダーを作成し、呼び出す Thread のコンテキストクラスローダーにそれを設定します。
デフォルトのシステムクラスローダーは、このクラスの実装依存インスタンスです。
このメソッドの最初の呼び出し時に、システムプロパティー「java.system.class.loader」が定義される場合、このプロパティーの値がシステムクラスローダーとして返されるクラスの名前になります。 このクラスは、デフォルトのシステムクラスローダーを使用してロードされます。また、このクラスは、委譲の親として使用される、ClassLoader 型の単一のパラメータを取る public コンストラクタを定義する必要があります。次に、このコンストラクタを使用し、デフォルトのシステムクラスローダーをパラメータに指定して、インスタンスが作成されます。結果として得られるクラスローダーは、システムクラスローダーとして定義されます。
セキュリティーマネージャーが存在し、呼び出し側のクラスローダーが null でなく、呼び出し側のクラスローダーがシステムクラスローダーと同じではないかその上位オブジェクトでもない場合、このメソッドは RuntimePermission("getClassLoader") アクセス権を使ってセキュリティーマネージャーの checkPermission メソッドを呼び出すことで、システムクラスローダーにアクセスできるかどうかを確認します。そうでない場合は、SecurityException がスローされます。
SecurityException - セキュリティーマネージャーが存在し、その checkPermission メソッドがこのシステムクラスローダーへのアクセスを許可しない場合
IllegalStateException - 「java.system.class.loader」プロパティーにより指定されたクラスローダーの構築時に、再帰的に呼び出される場合
Error - システムプロパティー「java.system.class.loader」は定義されるが、名前付きクラスをロードできない場合、プロバイダクラスは必須コンストラクタを定義しないか、その呼び出し時に例外がスローされる。エラーの根本原因は、Throwable.getCause() メソッドを使用して取得できる
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 オブジェクトを考慮してシールされる。そうでない場合、パッケージはシールされない
IllegalArgumentException - パッケージ名が、このクラスローダーかまたはその上位オブジェクトのうちの 1 つに存在するパッケージと重複する場合protected Package getPackage(String name)
name - パッケージ名
protected Package[] getPackages()
protected String findLibrary(String libname)
libname - ライブラリ名
System.loadLibrary(String),
System.mapLibraryName(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」の無名パッケージであることを示す (『Java 言語仕様』、セクション 7.4.2)enabled - このクラスローダーによりロードされ、名前付きパッケージまたはそのサブパッケージのどれかに属するクラスが、デフォルトで有効な宣言を保持する場合は true、デフォルトで無効な宣言を保持する場合は false
public void setClassAssertionStatus(String className,
boolean enabled)
名前付きクラスがトップレベルのクラスではない場合、この呼び出しは、どのようなクラスの宣言ステータスに対しても影響を与えません。戻り値は未定義になります。
className - 宣言ステータスを設定するトップレベルのクラスの完全指定クラス名enabled - 初期化時に、名前付きクラスで宣言を有効にする場合は true、宣言を無効にする場合は falsepublic void clearAssertionStatus()
|
Foundation 1.1.2 | |||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。