|
Java プラットフォーム 1.2 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
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
メソッドが呼び出されます。これによりセキュリティ例外が発生する場合があります。
checkCreateClassLoader
メソッドが新しいクラスローダの作成を許可しない場合SecurityException
,
SecurityManager.checkCreateClassLoader()
protected ClassLoader()
getSystemClassLoader()
メソッドによって返された ClassLoader
を親クラスローダとして使用し、新しいクラスローダを作成します。
このコンストラクタは、新しく作成されるクラスローダのそれぞれに対して呼び出されます。ClassLoader
クラスは抽象クラスなので、ClassLoader
クラス自体の新しいインスタンスを生成することはできません。ただし、ClassLoader
のサブクラスの各コンストラクタは、明示的または暗黙的、直接的または間接的にかかわらず、必然的にこのコンストラクタを呼び出します。
セキュリティマネージャが存在する場合は、セキュリティマネージャの checkCreateClassLoader
メソッドが呼び出されます。これによりセキュリティ例外が発生する場合があります。
checkCreateClassLoader
メソッドが新しいクラスローダの作成を許可しない場合SecurityException
,
SecurityManager.checkCreateClassLoader()
メソッドの詳細 |
public Class loadClass(String name) throws ClassNotFoundException
loadClass(String, boolean)
メソッドと同じ方法でクラスを検索します。Java Virtual Machine がこのメソッドを呼び出して、クラス参照を解釈処理します。このメソッドを呼び出すことは、loadClass(name, false)
を呼び出すことに相当します。name
- クラス名Class
オブジェクトprotected Class loadClass(String name, boolean resolve) throws ClassNotFoundException
findLoadedClass(String)
を呼び出して、クラスがすでにロードされたかどうかを確認します。
loadClass
メソッドを呼び出します。親が null
の場合、Virtual Machine に組み込まれたクラスローダが代わりに呼び出されます。
findClass(String)
メソッドを呼び出して、クラスを探します。
resolve
フラグが true のときには、このメソッドは見つかったクラスオブジェクトに対して resolveClass(Class)
メソッドを呼び出します。
JDK 1.2 以降は、ClassLoader のサブクラスが、このメソッドではなく findClass(String)
をオーバーライドすることが推奨されています。
name
- クラス名resolve
- true
の場合は、クラスを解釈処理するClass
オブジェクトprotected Class findClass(String name) throws ClassNotFoundException
loadClass
メソッドによって呼び出されます。デフォルトの実装は ClassNotFoundException
をスローします。name
- クラス名Class
オブジェクト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
オブジェクト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
オブジェクトoff
または len
のどちらかが負の場合、または off+len
が b.length
よりも大きい場合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
name
- クラス名b
- クラスバイトoff
- クラスバイトの開始オフセットlen
- クラスバイトの長さprotectionDomain
- クラスの ProtectionDomainClass
オブジェクトと、オプションの ProtectionDomainprotected final void resolveClass(Class c)
c
がすでにリンクされている場合、このメソッドは単に復帰します。そうでない場合、Java 言語仕様の「Execution」の章で説明しているように、クラスはリンクされます。c
- リンクするクラスc
が null
の場合defineClass(java.lang.String,byte[],int,int)
protected final Class findSystemClass(String name) throws ClassNotFoundException
JDK 1.2 より前では、このメソッドはローカルファイルシステムからクラスをプラットフォームに依存した方法でロードし、関連付けられているクラスローダを持たないクラスオブジェクトを返します。
JDK 1.2 以降、このメソッドはシステムクラスローダ (getSystemClassLoader()
を参照) を使ってクラスをロードします。返されるクラスオブジェクトは、そのクラスオブジェクトに関連付けられている ClassLoader
を持つことになります。ClassLoader
のサブクラスは通常、このメソッドを呼び出す必要はありません。これは、ほとんどのクラスローダが findClass(String)
だけをオーバーライドすればよいからです。
name
- 検索されるクラスの名前ClassLoader(ClassLoader)
,
getParent()
public final ClassLoader getParent()
null
を使って、ブートストラップクラスローダを表す場合もあります。このメソッドは、このクラスローダの親がブートストラップクラスローダの場合に、そのような実装で null
を返します。
セキュリティマネージャが存在する場合、呼び出し側のクラスローダが null でなく、このクラスローダの祖先でもない場合は、このメソッドは RuntimePermission("getClassLoader")
アクセス権を使ってセキュリティマネージャの checkPermission
メソッドを呼び出すことによって、親クラスローダに問題なくアクセスできることを保証します。そうでない場合は、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
オブジェクト。クラスがロードされていない場合は null
public URL getResource(String name)
リソースの名前は、「/」で区切られたパス名であり、これによってリソースが識別されます。
このメソッドは、まずリソースの親クラスローダを検索します。親が null
の場合、Virtual Machine に組み込まれたクラスローダのパスが検索されます。それに失敗すると、このメソッドはリソースを見つけるために findResource
を呼び出します。
name
- リソース名null
findResource(String)
public final Enumeration getResources(String name) throws IOException
リソースの名前は、「/」で区切られたパス名であり、これによってリソースが識別されます。
検索順については、getResource(String)
のドキュメントを参照してください。
name
- リソース名getResource(java.lang.String)
,
findResources(java.lang.String)
protected Enumeration findResources(String name) throws IOException
name
- リソース名protected URL findResource(String name)
name
- リソース名null
public static URL getSystemResource(String name)
JDK 1.1 では、使用される検索パスは Virtual Machine の組み込みクラスローダの検索パスです。
JDK 1.2 以降は、このメソッドはシステムクラスローダ (getSystemClassLoader()
を参照) を使ってリソースを見つけます。
name
- リソース名null
public static Enumeration getSystemResources(String name) throws IOException
URL
オブジェクトの Enumeration
として返されます。
検索順については、getSystemResource(String)
のドキュメントを参照してください。
name
- リソース名public InputStream getResourceAsStream(String name)
getResource(String)
のドキュメントを参照してください。name
- リソース名null
public static InputStream getSystemResourceAsStream(String name)
検索順については、getSystemResource(String)
のドキュメントを参照してください。
name
- リソース名null
public static ClassLoader getSystemClassLoader()
ClassLoader
インスタンスのデフォルトの委譲の親で、通常、アプリケーションを起動するためのクラスローダです。
セキュリティマネージャが存在する場合、呼び出し側のクラスローダが null でなく、このシステムクラスローダと同じでなく、このシステムクラスローダの祖先でもなければ、このメソッドは RuntimePermission("getClassLoader")
アクセス権を使ってセキュリティマネージャの checkPermission
メソッドを呼び出すことによって、システムクラスローダに問題なくアクセスできることを保証します。そうでない場合は、SecurityException
がスローされます。
ClassLoader
。ない場合は null
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 を考慮してシールされる。そうでない場合、パッケージはシールされないprotected Package getPackage(String name)
name
- パッケージ名protected Package[] getPackages()
protected String findLibrary(String libname)
null
を返す場合、VM は java.library.path
プロパティで指定されたパスにしたがってライブラリを検索します。libname
- ライブラリ名System.loadLibrary(java.lang.String)
,
System.mapLibraryName(java.lang.String)
|
Java プラットフォーム 1.2 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |