目次 | 前へ | 次へ | Java Core Reflection |
Field
、Method
、および Constructor
- クラスおよびインタフェースのメンバーとコンストラクタをリフレクションする。これらのクラスは次のものを提供する。Class
のメソッド - Field
、Method
、および Constructor
クラスの新規インスタンスの構築を準備する。Array
- Java 配列を動的に構築してアクセスするメソッドを提供する。Modifier
- クラスおよびそのメンバーに関する Java 言語修飾子情報のデコードを支援。InvocationTargetException
- リフレクションされたメソッドまたはコンストラクタによってスローされた例外をラップするために使用される。AccessibleObject
および ReflectPermission
- 標準の Java 言語アクセス制御を抑制するメカニズムを提供する。java.lang
パッケージにもリフレクションをサポートするものがあります。次に初期参照を示します。
Class
のインスタンスを保持する static フィールド。これらは、実行時にプリミティブ Java 型 (boolean
、byte
、char
、short
、int
、long
、float
、および double
) やキーワード void
を表す。Void
- キーワード void
を表す Class
オブジェクトへの参照を保持する。1 つのカテゴリは、実行時クラスに基づいてターゲットオブジェクトのすべての public
メンバーを検出して使用する必要があるアプリケーションで構成されます。これらのアプリケーションには、オブジェクトのすべての public
フィールド、メソッド、およびコンストラクタへの実行時アクセスが必要です。このカテゴリの例は、Java(TM) Beans[1] などのサービス、オブジェクトインスペクタなどの軽量ツールです。これらのアプリケーションは、クラス Class
のメソッド getField
、getMethod
、getConstructor
、getFields
、getMethods
、および getConstructors
によって取得されたクラス Field
、Method
、および Constructor
のインスタンスを使用します。
もう 1 つのカテゴリは、指定されたクラスによって宣言されたメンバーを検出して使用する必要がある、高度なアプリケーションで構成されます。これらのアプリケーションには、class
ファイルによって指定されたレベルのクラスの実装への、実行時アクセスが必要です。このカテゴリに入るアプリケーションには、インタプリタ、インスペクタ、クラスブラウザなどの開発ツールや、Java(TM) オブジェクト直列化 [2] などの実行サービスがあります。これらのアプリケーションは、クラス Class
のメソッド getDeclaredField
、getDeclaredMethod
、getDeclaredConstructor
、getDeclaredFields
、getDeclaredMethods
、および getDeclaredConstructors
によって取得されたクラス Field
、Method
、および Constructor
のインスタンスを使用します。
Field
、Method
、および Constructor
は final
です。Java 仮想マシンのみが、これらのクラスのインスタンスを作成できます。これらのオブジェクトは使って基になるオブジェクトを操作するために使用されます。つまり、
final
で、インスタンス化できないクラス Array
は、新規配列を作成したり、配列要素を取得して設定することを許可する static
メソッドを提供します。
Field
、Method
、および Constructor
は、Member
インタフェースを実装します。Member
のメソッドは、リフレクションされるメンバーの基本識別情報を照会するために使用されます。識別情報は、メンバーを宣言したクラスまたはインタフェース、メンバー自身の名前、およびメンバーの Java 言語修飾子 (public
、protected
、abstract
、synchronized
など) で構成されます。
Field
オブジェクトは、リフレクションされるフィールドを表します。基になるフィールドは、クラス変数 (static
フィールド) でもインスタンス変数 (非 static
フィールド) でもかまいません。クラス Field
のメソッドは、基になるフィールドの型を取得したり、オブジェクトの基になるフィールドの値を取得/設定したりするために使用されます。
Method
オブジェクトは、リフレクションされるメソッドを表します。基になるメソッドは、abstract メソッド、インスタンスメソッド、クラス (static
) メソッドのどれでもかまいません。
クラス Method
のメソッドは、基になるメソッドの仮パラメータ型、戻り値型、およびチェック例外型を取得するために使用されます。また、クラス Method
の invoke
メソッドは、ターゲットオブジェクトで基になるメソッドを呼び出すために使用されます。インスタンスおよび abstract メソッド呼び出しは、ターゲットオブジェクトの実行時クラスおよびリフレクションされるメソッドの宣言クラス、名前、および仮パラメータ型に基づく動的メソッド解決を使用します。(このため、インタフェースを実装するクラスのインスタンスであるオブジェクトで、リフレクションされるインタフェースメソッドを呼び出すことを許可できます。) static メソッド呼び出しは、メソッドの宣言クラスの基になる static メソッドを使用します。
Constructor
オブジェクトは、リフレクションされるコンストラクタを表します。クラス Constructor
のメソッドは、基になるコンストラクタの仮パラメータ型とチェック例外型を取得するために使用されます。さらに、クラス Constructor
の newInstance
メソッドは、コンストラクタを宣言するクラスの新規インスタンスを作成して初期化するために使用されます (クラスがインスタンス化可能である場合)。
Array
クラスは、プリミティブまたはクラスコンポーネント型の Java 配列を作成するクラスメソッドをエクスポートする、インスタンス化できないクラスです。クラス Array
のメソッドは、配列コンポーネント値を取得/設定するためにも使用されます。
Modifier
クラスは、クラスやメンバーの Java 言語修飾子をエンコードするクラスメソッドをエクスポートする、インスタンス化できないクラスです。言語修飾子は、Java 仮想マシン仕様で定義されたエンコード定数を使って整数でエンコードされます。
void
を実行時に表現するために使用される、9 個の Class
オブジェクトがあります。(これらは Class
オブジェクトで、クラスではありません。) Core Reflection API はこれらのオブジェクトを使って次のものを識別します。
Java 仮想マシンは、これらの 9 個の Class
オブジェクトを作成します。これらは、それらが表す型と同じ名前を持ちます。Class
オブジェクトは、次の public
final
static
変数でのみ表現できます。
java.lang.Boolean.TYPE java.lang.Character.TYPE java.lang.Byte.TYPE java.lang.Short.TYPE java.lang.Integer.TYPE java.lang.Long.TYPE java.lang.Float.TYPE java.lang.Double.TYPE java.lang.Void.TYPE特に、これらの
Class
オブジェクトは、クラス Class
の forName
メソッドからはアクセスできません。
Class
のメソッドが、Field
、Method
、および Constructor
のインスタンス用の唯一のソースであること。これらのメソッドは最初に、システムセキュリティーマネージャー (インストールされている場合) にセキュリティーチェックを委譲する (リフレクションベースアクセスの要求が拒否された場合に、SecurityException
をスローする。)protected
、デフォルト (パッケージ) アクセス、および private
クラスおよびメンバーに対する Java 言語標準アクセス制御チェックは通常、個々のリフレクションされるメンバーがオブジェクトの基になるメンバーでの操作 (つまり、フィールド値を取得/設定する、メソッドを呼び出す、新規オブジェクトを作成して初期化する) のために使用される。setAccessible
メソッドを使用する特権コードには、無制限アクセス (言語標準アクセス制御規則をオーバーライド) を付与できる。このメソッドは、クラス Field
、Method
、および Constructor
によって、AccessibleObject
から継承される。SecurityManager
の次の 2 つのメソッドで集中的に行われます。 void checkMemberAccess(Class,int) throws SecurityException
checkMemberAccess
の Class
パラメータは、メンバーへのアクセスが必要なクラスやインタフェースを識別します。int
パラメータは、アクセスされるメンバーセット (Member.PUBLIC
または Member.DECLARED
のいずれか) を識別します。
void checkPackageAccess(String pkg) throws SecurityException
java.lang.RuntimePermission
の 2 つのアクションを次に挙げます。次に初期参照を示します。
accessDeclaredMembers.
- クラスの public でないメンバーへのリフレクションを付与する。accessClassInPackage{package name}
。 - 指定されたパッケージのクラスへのアクセスを付与する。これらのアクセス権はセキュリティーマネージャーによって決定される。SecurityException
をスローします。セットへの要求されたアクセスが付与されると、メソッドは復帰します。
前述したように、このセットからリフレクションされるメンバーが次のような基になるオブジェクトでの操作に使用されるときは通常、Java 言語標準アクセス制御が適用されます。
この時点でアクセスが拒否されると、リフレクションされるメンバーはIllegalAccessException
をスローします。特定のリフレクションされるメンバーへの Java 言語アクセス制御は、setAccessible
メソッドを使ってフラグを設定することにより抑制できます。たとえば、次のとおりです。
public
でないメンバーとコンストラクタを含む) へのリフレクションベースアクセスを取得することを許可します。デフォルトでは、メンバーまたはコンストラクタへのリフレクションベースアクセスを取得するアプリケーションコードは、Java 言語標準アクセス制御でリフレクションされるメンバーまたはコンストラクタのみを使用できます。
標準ポリシーは、リフレクションされるメンバーの setAccessible
メソッドを呼び出すことでオーバーライドできます。setAccessible
メソッドを呼び出せるかどうかは、アクセス権 ReflectPermission
の suppressAccessChecks
ターゲットによって制御されます。
自動データ変換には次の 2 つのタイプがあります。ラッピング変換は、プリミティブ型の値からクラス型のオブジェクトの値に変換します。アンラッピング変換は、クラス型のオブジェクトの値からプリミティブ型の値に変換します。これらの変換に関する規則は、「ラッピング変換とアンラッピング変換」で定義します。
さらに、フィールドアクセスとメソッド呼び出しは、プリミティブ型および参照型での「拡張変換」を許可します。これらの変換は、Java 言語仕様、セクション 5 にドキュメント化されており、「拡張変換」で詳述されています。
Field.get
または Array.get
で取得したり、Method.invoke
で呼び出されたメソッドによって返されるときに、自動的にオブジェクトにラップされます。
同様にオブジェクト値は、プリミティブ型の値を必要とする、次のコンテキストのパラメータとして提供されると、自動的にアンラップされます。これらのコンテキストは、次のとおりです。
Field.set
、基になるフィールドはプリミティブ型を持つArray.set
、基になる配列はプリミティブ要素型を持つMethod.invoke
または Constructor.newInstance
、基になるメソッドまたはコンストラクタの対応する仮パラメータはプリミティブ型を持つプリミティブ型 | クラス型 |
---|---|
boolean |
java.lang.Boolean |
char |
java.lang.Character |
byte |
java.lang.Byte |
short |
java.lang.Short |
int |
java.lang.Integer |
long |
java.lang.Long |
float |
java.lang.Float |
double |
java.lang.Double |
void
宣言されるメソッドは、Method.invoke
から呼び出されると、特別参照 null
を返します。
Field
および Array
のメソッドによって、フィールドまたは配列から値を取得するときField
および Array
のメソッドによって、フィールドまたは配列に値を格納するときMethod.invoke
または Constructor.newInstance
によるメソッドまたはコンストラクタ呼び出し中に、アンラップされた実パラメータ値が対応する仮パラメータの型に変換されるときbyte
から short
、int
、long
、float
、または double
へshort
から int
、long
、float
、または double
へchar
から int
、long
、float
、または double
へint
から long
、float
、または double
へlong
から float
または double
へfloat
から double
へ。java.lang
の java.lang.reflect
という名前のサブパッケージ内にあります。これによって、Java のデフォルトパッケージインポート規則が原因の互換性の問題が回避されます。
* この Web サイトで使用されている用語「Java 仮想マシン」または「JVM」は、Java プラットフォーム用の仮想マシンを表します。