|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object java.lang.ClassLoader
public abstract class ClassLoader
クラスローダーは、クラスのロードを担当するオブジェクトです。ClassLoader クラスは abstract クラスです。クラスのバイナリ名を指定すると、クラスローダーはクラスの定義を構成するデータを見つけるか生成します。一般的な方法としては、名前をファイル名に変換して、ファイルシステムからその名前の「クラスファイル」を読み込みます。
各 Class
オブジェクトは、そのオブジェクトを定義した ClassLoader への reference
を格納しています。
配列クラスの Class オブジェクトは、クラスローダーによっては作成されず、Java Runtime の要求に応じて自動的に作成されます。配列クラスのクラスローダーは、Class.getClassLoader()
によって返され、その要素の型のクラスローダーと同じになります。 要素の型がプリミティブ型の場合には、配列クラスにクラスローダーはありません。
アプリケーションは、Java Virtual Machine が動的にクラスをロードするように拡張するため、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 . . . } }
ClassLoader のメソッドに String
パラメータとして提供されるクラス名は、『Java 言語仕様』で定義されたバイナリ名である必要があります。
次に、有効なクラス名の例を示します。
"java.lang.String" "javax.swing.JSpinner$DefaultEditor" "java.security.KeyStore$Builder$FileBuilder$1" "java.net.URLClassLoader$3$1"
resolveClass(Class)
コンストラクタの概要 | |
---|---|
protected |
ClassLoader()
getSystemClassLoader() メソッドによって返された ClassLoader を親クラスローダーとして使用し、新しいクラスローダーを作成します。 |
protected |
ClassLoader(ClassLoader parent)
指定された親クラスローダを使って、委譲のために新しいクラスローダを作成します。 |
メソッドの概要 | |
---|---|
void |
clearAssertionStatus()
このクラスローダーのデフォルト宣言ステータスを false に設定し、クラスローダーに関連付けられたデフォルトパッケージおよびクラス宣言ステータス設定をすべて破棄します。 |
protected Class<?> |
defineClass(byte[] b,
int off,
int len)
推奨されていません。 defineClass(String, byte[], int, int) に置き換えられました。 |
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 Class<?> |
defineClass(String name,
ByteBuffer b,
ProtectionDomain protectionDomain)
オプションの ProtectionDomain を使って、 ByteBuffer を 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<URL> |
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<URL> |
getResources(String name)
指定された名前を持つすべてのリソースを検索します。 |
static ClassLoader |
getSystemClassLoader()
委譲のためのシステムクラスローダーを返します。 |
static URL |
getSystemResource(String name)
クラスをロードするために使用される検索パスから、指定された名前のリソースを探します。 |
static InputStream |
getSystemResourceAsStream(String name)
クラスをロードするのに使用される検索パスから、指定された名前のリソースを、読み込み用にオープンします。 |
static Enumeration<URL> |
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 メソッドが新しいクラスローダーの作成を許可しない場合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
- クラスが見つからない場合@Deprecated protected final Class<?> defineClass(byte[] b, int off, int len) throws ClassFormatError
defineClass(String, byte[], int, int)
に置き換えられました。
b
- クラスデータを構成するバイト。off から off+len-1 までの位置にある byte は、Java 仮想マシン仕様で定義される有効なクラスファイルの形式を持つoff
- クラスデータの b の開始オフセットlen
- クラスデータの長さ
ClassFormatError
- データが有効なクラスを含まなかった場合
IndexOutOfBoundsException
- off または len のどちらかが負の場合、または off+len が b.length よりも大きい場合loadClass(String, boolean)
,
resolveClass(Class)
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
- クラスの予想されるバイナリ名。 不明な場合は nullb
- クラスデータを構成するバイト。off から off+len-1 までの位置にある byte は、Java 仮想マシン仕様で定義される有効なクラスファイルの形式を持つoff
- クラスデータの b の開始オフセットlen
- クラスデータの長さ
ClassFormatError
- データが有効なクラスを含まなかった場合
IndexOutOfBoundsException
- off または len のどちらかが負の場合、または off+len が b.length よりも大きい場合
SecurityException
- このクラスとは異なる証明書セット (符号なし) を使って署名されたクラスを含むパッケージに、このクラスを追加しようとする場合、または nameが「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を指定することはできません。name が null ではない場合には、バイト配列「b」で指定されたクラスのバイナリ名に等しくなければいけません。 等しくない場合、NoClassDefFoundError がスローされます。
name
- クラスの予想されるバイナリ名。 不明な場合は nullb
- クラスデータを構成するバイト。off から off+len-1 までの位置にある byte は、Java 仮想マシン仕様で定義される有効なクラスファイルの形式を持つoff
- クラスデータの b の開始オフセットlen
- クラスデータの長さprotectionDomain
- このクラスの ProtectionDomain
ClassFormatError
- データが有効なクラスを含まなかった場合
NoClassDefFoundError
- name が b で指定されたクラスのバイナリ名と等しくない場合
IndexOutOfBoundsException
- off または len のどちらかが負の場合、または off+len が b.length よりも大きい場合
SecurityException
- このクラスとは異なる証明書セットを使って署名されたクラスを含むパッケージに、このクラスを追加しようとする場合、または name が「java.」で始まる場合protected final Class<?> defineClass(String name, ByteBuffer b, ProtectionDomain protectionDomain) throws ClassFormatError
ByteBuffer
を Class クラスのインスタンスに変換します。ドメインが null の場合は、デフォルトのドメインが、defineClass(String, byte[], int, int)
のドキュメントで指定されているとおりクラスに割り当てられています。最初にクラスを解決してからでなければ、クラスを使用することはできません。
パッケージの証明書のセットを決定しているパッケージで定義された最初のクラスに関する規則と、クラス名での制約は、defineClass(String, byte[], int, int, ProtectionDomain)
のドキュメントで指定されているものと同等です。
このフォームのメソッド呼び出し cl.defineClass(name, bBuffer, pd) では、次の文と正確に同じ結果が得られます。
...
byte[] temp = new byte[bBuffer.remaining
()];
bBuffer.get
(temp);
return#defineClass(String, byte[], int, int, ProtectionDomain)
cl.defineClass(name, temp, 0, temp.length, pd);
name
- クラスの予想されるバイナリ名。不明な場合は nullb
- クラスデータを構成するバイト。b.position() から b.position() + b.limit() -1 までの位置にある byte は、Java 仮想マシン仕様で定義される有効なクラスファイルの形式を持つprotectionDomain
- このクラスの ProtectionDomain、または null
ClassFormatError
- データが有効なクラスを含まなかった場合
NoClassDefFoundError
- name が b で指定されたクラスのバイナリ名と等しくない場合
SecurityException
- このクラスとは異なる証明書セットを使って署名されたクラスを含むパッケージに、このクラスを追加しようとする場合、または name が「java.」で始まる場合defineClass(String, byte[], int, int, ProtectionDomain)
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 Enumeration<URL> getResources(String name) throws IOException
リソースの名前は、「/」で区切られたパス名であり、これによってリソースが識別されます。
検索順については、getResource(String)
のドキュメントを参照してください。
name
- リソース名
URL
オブジェクトの列挙。リソースが見つからなかった場合、列挙は空になる。クラスローダーがアクセスを持たないリソースは列挙に入らない
IOException
- 入出力エラーが発生した場合findResources(String)
protected URL findResource(String name)
name
- リソース名
protected Enumeration<URL> findResources(String name) throws IOException
URL
オブジェクトの列挙を返します。クラスローダーの実装は、リソースのロード元を特定するためにこのメソッドをオーバーライドします。
name
- リソース名
URL
オブジェクトの列挙
IOException
- 入出力エラーが発生した場合public static URL getSystemResource(String name)
getSystemClassLoader()
を参照) を使ってリソースを見つけます。
name
- リソース名
URL
オブジェクト。 リソースが見つからなかった場合は nullpublic static Enumeration<URL> 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、デフォルトで無効な場合は falsepublic 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、デフォルトで無効な宣言を保持する場合は falsepublic void setClassAssertionStatus(String className, boolean enabled)
名前付きクラスがトップレベルのクラスではない場合、この呼び出しは、どのようなクラスの宣言ステータスに対しても影響を与えません。
className
- 宣言ステータスを設定するトップレベルのクラスの完全指定クラス名enabled
- 初期化時に、名前付きクラスで宣言を有効にする場合は true、宣言を無効にする場合は falsepublic void clearAssertionStatus()
|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。