-
public interface MethodHandleInfo
直接メソッド・ハンドルをその構成要素シンボリック部分に解決することによって取得されるシンボリック参照。 直接メソッド・ハンドルを解決するには、Lookup.revealDirect
を呼び出してください。直接メソッド・ハンドル
直接メソッド・ハンドルは、引数バインディングまたは他の変換が介在しないメソッド、コンストラクタ、またはフィールドを表します。 直接メソッド・ハンドルによって参照されるメソッド、コンストラクタまたはフィールドは、その基礎となるメンバーと呼ばれます。 直接メソッド・ハンドルはこれらの方法で取得できます。CONSTANT_MethodHandle
定数のldc
命令を実行する。 (『Java Virtual Machine Specification』のセクション4.4.8および5.4.3を参照してください。)- いずれかのルックアップ・ファクトリ・メソッド(
Lookup.findVirtual
など)を呼び出すことで、シンボリック参照をメソッド・ハンドルに解決する。 シンボリック参照はクラス、名前文字列および型で構成されます。 - ファクトリ・メソッド
Lookup.unreflect
またはLookup.unreflectSpecial
を呼び出すことで、Method
をメソッド・ハンドルに変換する。 - ファクトリ・メソッド
Lookup.unreflectConstructor
を呼び出すことで、Constructor
をメソッド・ハンドルに変換する。 - ファクトリ・メソッド
Lookup.unreflectGetter
またはLookup.unreflectSetter
を呼び出すことで、Field
をメソッド・ハンドルに変換する。
解決時の制限
適切なLookup
オブジェクトが渡されると、直接メソッド・ハンドルを解決して、基礎となるメソッド、コンストラクタまたはフィールドのシンボリック参照を復元できます。 解決は、ターゲット・メソッド・ハンドルを作成したもの、または同等のメソッド・ハンドルを再作成するために十分なアクセス権を持つものと同等のLookup
オブジェクトを介して行う必要があります。基礎となるメソッドが呼出し元依存の場合、直接メソッド・ハンドルは特定の呼出し元クラス(ルックアップ・オブジェクトを作成するために使用されたルックアップ・クラス)にバインドされます。 別のルックアップ・クラスを使用したこのメソッド・ハンドルの解決は失敗します(
Class.forName
など、基礎となるメソッドがpublicの場合でも)。ルックアップ・オブジェクト・マッチングの要件はプログラムにファスト・フェイル動作を提供します。そうでない場合、想定外のスコープのシンボリック情報(または呼出し元バインディング)でメソッド・ハンドルが誤って解決されても、それをプログラムが信頼する可能性があります。 この制限をオーバーライドする場合は、
MethodHandles.reflectAs(java.lang.Class<T>, java.lang.invoke.MethodHandle)
を使用してください。参照の種類
ルックアップ・ファクトリ・メソッドは、メソッド、コンストラクタおよびフィールドの主要ユース・ケースのすべてに対応しています。 これらのユース・ケースは次のように小さな整数を使用して識別できます。参照の種類 説明的な名前 スコープ メンバー 動作 1
REF_getField
class
FT f;
(T) this.f;
2
REF_getStatic
class
またはinterface
static
FT f;
(T) C.f;
3
REF_putField
class
FT f;
this.f = x;
4
REF_putStatic
class
static
FT f;
C.f = arg;
5
REF_invokeVirtual
class
T m(A*);
(T) this.m(arg*);
6
REF_invokeStatic
class
またはinterface
static
T m(A*);
(T) C.m(arg*);
7
REF_invokeSpecial
class
またはinterface
T m(A*);
(T) super.m(arg*);
8
REF_newInvokeSpecial
class
C(A*);
new C(arg*);
9
REF_invokeInterface
interface
T m(A*);
(T) this.m(arg*);
- 導入されたバージョン:
- 1.8
-
-
フィールドのサマリー
フィールド 修飾子と型 フィールド 説明 static int
REF_getField
前述の表で定義されている、直接メソッド・ハンドルの参照の種類。static int
REF_getStatic
前述の表で定義されている、直接メソッド・ハンドルの参照の種類。static int
REF_invokeInterface
前述の表で定義されている、直接メソッド・ハンドルの参照の種類。static int
REF_invokeSpecial
前述の表で定義されている、直接メソッド・ハンドルの参照の種類。static int
REF_invokeStatic
前述の表で定義されている、直接メソッド・ハンドルの参照の種類。static int
REF_invokeVirtual
前述の表で定義されている、直接メソッド・ハンドルの参照の種類。static int
REF_newInvokeSpecial
前述の表で定義されている、直接メソッド・ハンドルの参照の種類。static int
REF_putField
前述の表で定義されている、直接メソッド・ハンドルの参照の種類。static int
REF_putStatic
前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
-
メソッドのサマリー
すべてのメソッド staticメソッド インスタンス・メソッド 抽象メソッド デフォルト・メソッド 修飾子と型 メソッド 説明 Class<?>
getDeclaringClass()
解読されたメソッド・ハンドルの基礎となるメンバーが定義されたクラスを返します。MethodType
getMethodType()
解決されたシンボリック参照の公称型をメソッド型として表現して返します。int
getModifiers()
基礎となるメンバーのアクセス修飾子を返します。String
getName()
解決されたメソッド・ハンドルの基礎となるメンバーの名前を返します。int
getReferenceKind()
解読されたメソッド・ハンドルの参照の種類を返します。これに基づいて、メソッド・ハンドルの基礎となるメンバーがコンストラクタ、メソッド、フィールドのいずれであったかを判定します。default boolean
isVarArgs()
基礎となるメンバーが、引数カウントが可変のメソッドまたはコンストラクタであったかどうかを判定します。static String
referenceKindToString(int referenceKind)
前述の表で定義されている、指定された参照の種類を説明する名前を返します。<T extends Member>
TreflectAs(Class<T> expected, MethodHandles.Lookup lookup)
メソッド、コンストラクタまたはフィールド・オブジクトの基礎となるメンバーをリフレクトします。static String
toString(int kind, Class<?> defc, String name, MethodType type)
MethodHandleInfo
の文字列表現を、そのシンボリック参照の4つの部分を基に返します。
-
-
-
メソッドの詳細
-
getReferenceKind
int getReferenceKind()
解読されたメソッド・ハンドルの参照の種類を返します。これに基づいて、メソッド・ハンドルの基礎となるメンバーがコンストラクタ、メソッド、フィールドのいずれであったかを判定します。 定義については前述の表を参照してください。- 戻り値:
- 基礎となるメンバーへのアクセスに使用される参照の種類の整数コード
-
getDeclaringClass
Class<?> getDeclaringClass()
解読されたメソッド・ハンドルの基礎となるメンバーが定義されたクラスを返します。- 戻り値:
- 基礎となるメンバーを宣言しているクラス
-
getName
String getName()
解決されたメソッド・ハンドルの基礎となるメンバーの名前を返します。 これは、基礎となるメンバーがコンストラクタだった場合は"<init>"
、そうでない場合は単純なメソッド名またはフィールド名です。- 戻り値:
- 基本となるメンバーの単純名
-
getMethodType
MethodType getMethodType()
解決されたシンボリック参照の公称型をメソッド型として表現して返します。 コンストラクタへの参照の場合、戻り型はvoid
になります。 非staticメソッドへの参照の場合、メソッド型はthis
パラメータを言及しません。 フィールドへの参照で、要求されたアクセスがフィールド読み取りの場合、メソッド型はパラメータを持たず、フィールド型を返します。 フィールドへの参照で、要求されたアクセスがフィールド書き出しの場合、メソッド型はフィールド型のパラメータを1つ持ち、void
を返します。元の直接メソッド・ハンドルは先頭
this
パラメータを含んでいることがあり、(コンストラクタの場合)void
戻り型を構築されたクラスで置き換えます。 公称型はthis
パラメータを含まず、(コンストラクタの場合)void
を返します。- 戻り値:
- メソッド型として表現された、基礎となるメンバーの型
-
reflectAs
<T extends Member> T reflectAs(Class<T> expected, MethodHandles.Lookup lookup)
メソッド、コンストラクタまたはフィールド・オブジクトの基礎となるメンバーをリフレクトします。 基礎となるメンバーがpublicの場合、getMethod
、getConstructor
またはgetField
によって行われるようにリフレクトされます。 そうでない場合、getDeclaredMethod
、getDeclaredConstructor
またはgetDeclaredField
によって行われるようにリフレクトされます。 指定されたルックアップ・オブジェクトから基礎となるメンバーにアクセスできる必要があります。- 型パラメータ:
T
- 結果に期待する型(Member
またはサブタイプ)- パラメータ:
expected
- 期待する結果型T
を表すクラス・オブジェクトlookup
- このMethodHandleInfoを作成したルックアップ・オブジェクト、または同等のアクセス特権を持つもの- 戻り値:
- メソッド、コンストラクタまたはフィールド・オブジクトへの参照
- 例外:
ClassCastException
- メンバーが期待される型でない場合NullPointerException
- どちらかの引数がnull
の場合IllegalArgumentException
- 指定されたルックアップ・オブジェクトから基礎となるメンバーにアクセスできない場合
-
getModifiers
int getModifiers()
基礎となるメンバーのアクセス修飾子を返します。- 戻り値:
- 基礎となるメンバーのJava言語修飾子、そのメンバーにアクセスできない場合は-1
- 関連項目:
Modifier
、reflectAs(java.lang.Class<T>, java.lang.invoke.MethodHandles.Lookup)
-
isVarArgs
default boolean isVarArgs()
基礎となるメンバーが、引数カウントが可変のメソッドまたはコンストラクタであったかどうかを判定します。 そのようなメンバーは可変引数コレクタであるメソッド・ハンドルによって表されます。- 実装要件:
- これは次と同等の結果を生成します。
getReferenceKind() >= REF_invokeVirtual && Modifier.isTransient(getModifiers())
- 戻り値:
- 基礎となるメンバーが可変引数で宣言された場合にのみ
true
。
-
referenceKindToString
static String referenceKindToString(int referenceKind)
前述の表で定義されている、指定された参照の種類を説明する名前を返します。 従来の接頭辞REF_は省略されます。- パラメータ:
referenceKind
- クラス・メンバーへのアクセスに使用される参照の種類の整数コード- 戻り値:
"getField"
など、大文字小文字混在文字列- 例外:
IllegalArgumentException
- 引数が有効な参照の種類番号でない場合
-
toString
static String toString(int kind, Class<?> defc, String name, MethodType type)
MethodHandleInfo
の文字列表現を、そのシンボリック参照の4つの部分を基に返します。 これは"RK C.N:MT"
形式に定義されます。RK
はkind
の参照の種類文字列、C
はdefc
の名前、N
はname
、MT
はtype
です。 これらの4つの値は、MethodHandleInfo
オブジェクトの参照の種類、宣言しているクラス、メンバー名およびメンバー型から取得できます。- 実装要件:
- これは次と同等の結果を生成します。
String.format("%s %s.%s:%s", referenceKindToString(kind), defc.getName(), name, type)
- パラメータ:
kind
- シンボリック参照の参照の種類部分defc
- シンボリック参照の宣言しているクラス部分name
- シンボリック参照のメンバー名部分type
- シンボリック参照のメンバー型部分- 戻り値:
"RK C.N:MT"
形式の文字列- 例外:
IllegalArgumentException
- 最初の引数が有効な参照の種類番号でない場合NullPointerException
- いずれかの参照引数がnull
の場合
-
-