モジュール 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)を使用してください。

    参照の種類

    ルックアップ・ファクトリ・メソッドは、メソッド、コンストラクタおよびフィールドの主要ユース・ケースのすべてに対応しています。 これらのユース・ケースは次のように小さな整数を使用して識別できます。
    参照の種類
    参照の種類説明的な名前スコープメンバー動作
    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
    • メソッドのサマリー

      修飾子と型 メソッド 説明
      Class<?> getDeclaringClass()
      解読されたメソッド・ハンドルの基礎となるメンバーが定義されたクラスを返します。
      MethodType getMethodType()
      解決されたシンボリック参照の公称型をメソッド型として表現して返します。
      int getModifiers()
      基礎となるメンバーのアクセス修飾子を返します。
      String getName()
      解決されたメソッド・ハンドルの基礎となるメンバーの名前を返します。
      int getReferenceKind()
      解読されたメソッド・ハンドルの参照の種類を返します。これに基づいて、メソッド・ハンドルの基礎となるメンバーがコンストラクタ、メソッド、フィールドのいずれであったかを判定します。
      default boolean isVarArgs()
      基礎となるメンバーが、引数カウントが可変のメソッドまたはコンストラクタであったかどうかを判定します。
      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_getStatic

        static final int REF_getStatic
        前述の表で定義されている、直接メソッド・ハンドルの参照の種類。
        関連項目:
        定数フィールド値
      • 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 - 指定されたルックアップ・オブジェクトから基礎となるメンバーにアクセスできない場合
      • isVarArgs

        default boolean isVarArgs()
        基礎となるメンバーが、引数カウントが可変のメソッドまたはコンストラクタであったかどうかを判定します。 そのようなメンバーは可変引数コレクタであるメソッド・ハンドルによって表されます。
        実装要件:
        これは次と同等の結果を生成します。
        
             getReferenceKind() >= REF_invokeVirtual && Modifier.isTransient(getModifiers())
         
        戻り値:
        基礎となるメンバーが可変引数で宣言された場合にのみtrue
      • referenceKindToString

        static String referenceKindToString​(int referenceKind)
        前述の表で定義されている、指定された参照の種類を説明する名前を返します。 従来の接頭辞REF_は省略されます。
        パラメータ:
        referenceKind - クラス・メンバーへのアクセスに使用される参照の種類の整数コード
        戻り値:
        "getField"など、大文字小文字混在文字列
        例外:
        IllegalArgumentException - 引数が有効な参照の種類番号でない場合