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 |
staticFT f; | (T) C.f; |
3 | REF_putField | class |
FT f; | this.f = x; |
4 | REF_putStatic | class |
staticFT f; | C.f = arg; |
5 | REF_invokeVirtual | class |
T m(A*); | (T) this.m(arg*); |
6 | REF_invokeStatic | classまたはinterface |
staticT 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*); |
| 修飾子と型 | フィールド | 説明 |
|---|---|---|
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 |
前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
|
| 修飾子と型 | メソッド | 説明 |
|---|---|---|
Class<?> |
getDeclaringClass() |
解読されたメソッド・ハンドルの基礎となるメンバーが定義されたクラスを返します。
|
MethodType |
getMethodType() |
解決されたシンボリック参照の公称型をメソッド型として表現して返します。
|
int |
getModifiers() |
基礎となるメンバーのアクセス修飾子を返します。
|
String |
getName() |
解決されたメソッド・ハンドルの基礎となるメンバーの名前を返します。
|
int |
getReferenceKind() |
解読されたメソッド・ハンドルの参照の種類を返します。これに基づいて、メソッド・ハンドルの基礎となるメンバーがコンストラクタ、メソッド、フィールドのいずれであったかを判定します。
|
default boolean |
isVarArgs() |
基礎となるメンバーが、引数カウントが可変のメソッドまたはコンストラクタであったかどうかを判定します。
|
static String |
referenceKindToString(int referenceKind) |
前述の表で定義されている、指定された参照の種類を説明する名前を返します。
|
<T extends Member> |
reflectAs(Class<T> expected, MethodHandles.Lookup lookup) |
メソッド、コンストラクタまたはフィールド・オブジクトの基礎となるメンバーをリフレクトします。
|
static String |
toString(int kind, Class<?> defc, String name, MethodType type) |
MethodHandleInfoの文字列表現を、そのシンボリック参照の4つの部分を基に返します。 |
static final int REF_newInvokeSpecial
int getReferenceKind()
Class<?> getDeclaringClass()
String getName()
"<init>"、そうでない場合は単純なメソッド名またはフィールド名です。 MethodType getMethodType()
voidになります。 非staticメソッドへの参照の場合、メソッド型はthisパラメータを言及しません。 フィールドへの参照で、要求されたアクセスがフィールド読み取りの場合、メソッド型はパラメータを持たず、フィールド型を返します。 フィールドへの参照で、要求されたアクセスがフィールド書き出しの場合、メソッド型はフィールド型のパラメータを1つ持ち、voidを返します。
元の直接メソッド・ハンドルは先頭thisパラメータを含んでいることがあり、(コンストラクタの場合) void戻り型を構築されたクラスで置き換えます。 公称型はthisパラメータを含まず、(コンストラクタの場合) voidを返します。
<T extends Member> T reflectAs(Class<T> expected, MethodHandles.Lookup lookup)
getMethod、getConstructorまたはgetFieldによって行われるようにリフレクトされます。 そうでない場合、getDeclaredMethod、getDeclaredConstructorまたはgetDeclaredFieldによって行われるようにリフレクトされます。 指定されたルックアップ・オブジェクトから基礎となるメンバーにアクセスできる必要があります。 T - 結果に期待する型(Memberまたはサブタイプ)expected - 期待する結果型Tを表すクラス・オブジェクトlookup - このMethodHandleInfoを作成したルックアップ・オブジェクト、または同等のアクセス特権を持つものClassCastException - メンバーが期待される型でない場合NullPointerException - どちらかの引数がnullの場合IllegalArgumentException - 指定されたルックアップ・オブジェクトから基礎となるメンバーにアクセスできない場合int getModifiers()
Modifier、reflectAs(java.lang.Class<T>, java.lang.invoke.MethodHandles.Lookup)default boolean isVarArgs()
getReferenceKind() >= REF_invokeVirtual && Modifier.isTransient(getModifiers())
true。static String referenceKindToString(int referenceKind)
referenceKind - クラス・メンバーへのアクセスに使用される参照の種類の整数コード"getField"など、大文字小文字混在文字列IllegalArgumentException - 引数が有効な参照の種類番号でない場合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の場合 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。 そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2025, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Documentation Redistribution Policyも参照してください。