モジュール java.base
パッケージ java.lang.invoke

インタフェースMethodHandleInfo


public interface MethodHandleInfo
直接メソッド・ハンドルをその構成要素のシンボリック部分にクラッシュすることによって取得されるシンボリック参照。 直接メソッド・ハンドルを解決するには、Lookup.revealDirectを呼び出してください。

直接メソッド・ハンドル

直接メソッド・ハンドルは、引数バインディングまたは他の変換が介在しないメソッド、コンストラクタ、またはフィールドを表します。 直接メソッド・ハンドルによって参照されるメソッド、コンストラクタまたはフィールドは、その基礎となるメンバーと呼ばれます。 直接メソッド・ハンドルはこれらの方法で取得できます。

解決時の制限

適切なLookupオブジェクトが渡されると、直接メソッド・ハンドルを解決して、基礎となるメソッド、コンストラクタまたはフィールドのシンボリック参照を復元できます。 解決は、ターゲット・メソッド・ハンドルを作成したもの、または同等のメソッド・ハンドルを再作成するために十分なアクセス権を持つものと同等のLookupオブジェクトを介して行う必要があります。

基礎となるメソッドが呼出し元依存の場合、直接メソッド・ハンドルは特定の呼出し元クラス(ルックアップ・オブジェクトを作成するために使用されたルックアップ・クラス)にバインドされます。 別のルックアップ・クラスを使用したこのメソッド・ハンドルの解決は失敗します(Class.forNameなど、基礎となるメソッドがpublicの場合でも)。

ルックアップ・オブジェクト・マッチングの要件はプログラムにファスト・フェイル動作を提供します。そうでない場合、想定外のスコープのシンボリック情報(または呼出し元バインディング)でメソッド・ハンドルが誤って解決されても、それをプログラムが信頼する可能性があります。 この制限をオーバーライドする場合は、MethodHandles.reflectAs(java.lang.Class<T>, java.lang.invoke.MethodHandle)を使用してください。

参照の種類

ルックアップ・ファクトリ・メソッドは、メソッド、コンストラクタおよびフィールドの主要ユース・ケースのすべてに対応しています。 これらのユース・ケースは次のように小さな整数を使用して識別できます。
参照の種類
参照の種類説明的な名前scopemember動作
1REF_getFieldclass FT f;(T) this.f;
2REF_getStaticclassまたはinterface static
FT f;
(T) C.f;
3REF_putFieldclass FT f;this.f = x;
4REF_putStaticclass static
FT f;
C.f = arg;
5REF_invokeVirtualclass T m(A*);(T) this.m(arg*);
6REF_invokeStaticclassまたはinterface static
T m(A*);
(T) C.m(arg*);
7REF_invokeSpecialclassまたはinterface T m(A*);(T) super.m(arg*);
8REF_newInvokeSpecialclass C(A*);new C(arg*);
9REF_invokeInterfaceinterface T m(A*);(T) this.m(arg*);
導入されたバージョン:
1.8
  • フィールドのサマリー

    フィールド
    修飾子と型
    フィールド
    説明
    static final int
    前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
    static final int
    前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
    static final int
    前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
    static final int
    前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
    static final int
    前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
    static final int
    前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
    static final int
    前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
    static final int
    前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
    static final int
    前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    解読されたメソッド・ハンドルの基礎となるメンバーが定義されたクラスを返します。
    解決されたシンボリック参照の公称型をメソッド型として表現して返します。
    int
    基礎となるメンバーのアクセス修飾子を返します。
    解決されたメソッド・ハンドルの基礎となるメンバーの名前を返します。
    int
    解読されたメソッド・ハンドルの参照の種類を返します。これに基づいて、メソッド・ハンドルの基礎となるメンバーがコンストラクタ、メソッド、フィールドのいずれであったかを判定します。
    default boolean
    基礎となるメンバーが、引数カウントが可変のメソッドまたはコンストラクタであったかどうかを判定します。
    static String
    referenceKindToString(int referenceKind)
    前述の表で定義されている、指定された参照の種類を説明する名前を返します。
    <T extends Member>
    T
    reflectAs(Class<T> expected, MethodHandles.Lookup lookup)
    メソッド、コンストラクタまたはフィールド・オブジクトの基礎となるメンバーをリフレクトします。
    static String
    toString(int kind, Class<?> defc, String name, MethodType type)
    MethodHandleInfoの文字列表現を、そのシンボリック参照の4つの部分を基に返します。
  • フィールド詳細

    • REF_getField

      static final int REF_getField
      前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
      関連項目:
    • REF_getStatic

      static final int REF_getStatic
      前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
      関連項目:
    • REF_putField

      static final int REF_putField
      前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
      関連項目:
    • REF_putStatic

      static final int REF_putStatic
      前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
      関連項目:
    • REF_invokeVirtual

      static final int REF_invokeVirtual
      前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
      関連項目:
    • REF_invokeStatic

      static final int REF_invokeStatic
      前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
      関連項目:
    • REF_invokeSpecial

      static final int REF_invokeSpecial
      前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
      関連項目:
    • REF_newInvokeSpecial

      static final int REF_newInvokeSpecial
      前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
      関連項目:
    • REF_invokeInterface

      static final int REF_invokeInterface
      前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
      関連項目:
  • メソッドの詳細

    • 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の場合、getMethodgetConstructorまたはgetFieldによって行われるようにリフレクトされます。 そうでない場合、getDeclaredMethodgetDeclaredConstructorまたはgetDeclaredFieldによって行われるようにリフレクトされます。 指定されたルックアップ・オブジェクトから基礎となるメンバーにアクセスできる必要があります。
      型パラメータ:
      T - 結果に期待する型(Memberまたはサブタイプ)
      パラメータ:
      expected - 期待する結果型Tを表すクラス・オブジェクト
      lookup - このMethodHandleInfoを作成したルックアップ・オブジェクト、または同等のアクセス特権を持つもの
      戻り値:
      メソッド、コンストラクタまたはフィールド・オブジクトへの参照
      例外:
      ClassCastException - メンバーが期待される型でない場合
      NullPointerException - どちらかの引数がnullの場合
      IllegalArgumentException - 指定されたルックアップ・オブジェクトから基礎となるメンバーにアクセスできない場合
    • getModifiers

      int getModifiers()
      基礎となるメンバーのアクセス修飾子を返します。
      戻り値:
      基礎となるメンバーのJava言語修飾子、そのメンバーにアクセスできない場合は-1
      関連項目:
    • 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"形式に定義されます。RKkind参照の種類文字列Cdefc名前NnameMTtypeです。 これらの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の場合