次の方法で共有


MethodHandles.Lookup.FindVirtual(Class, String, MethodType) メソッド

定義

仮想メソッドのメソッド ハンドルを生成します。

[Android.Runtime.Register("findVirtual", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)]
public Java.Lang.Invoke.MethodHandle FindVirtual (Java.Lang.Class refc, string name, Java.Lang.Invoke.MethodType type);
[<Android.Runtime.Register("findVirtual", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)>]
member this.FindVirtual : Java.Lang.Class * string * Java.Lang.Invoke.MethodType -> Java.Lang.Invoke.MethodHandle

パラメーター

refc
Class

メソッドにアクセスするクラスまたはインターフェイス

name
String

メソッドの名前

type
MethodType

メソッドの型(受信側引数を省略)

戻り値

目的のメソッド ハンドル

属性

注釈

仮想メソッドのメソッド ハンドルを生成します。 メソッド ハンドルの型はメソッドの型になり、受信側の型 (通常 refc) が先頭に付加されます。 メソッドとそのすべての引数型には、参照オブジェクトからアクセスできる必要があります。

呼び出されると、ハンドルは最初の引数を受信側として扱い、受信側の型にディスパッチして、入力するメソッドの実装を決定します。 (ディスパッチ アクションは、またはinvokeinterface命令によってinvokevirtual実行されるアクションと同じです)。

ルックアップ クラスにメンバーにアクセスするための完全な権限がある場合、最初の引数は型 refc になります。 それ以外の場合はメンバーを指定 protected する必要があり、最初の引数は型で参照クラスに制限されます。

メソッドの変数アリティ修飾子ビット (0x0080) が設定されている場合にのみ、返されるメソッド ハンドルには MethodHandle#asVarargsCollector 変数アリティがあります。

命令とメソッド ハンドルの間invokevirtualの一般的な等価性により、クラスが名前文字列または名前文字列invokeExactinvokeである場合、MethodHandle結果のメソッド ハンドルは、同じ引数によって生成されたものまたはjava.lang.invoke.MethodHandles#invoker MethodHandles.invoker同じtype引数をjava.lang.invoke.MethodHandles#exactInvoker MethodHandles.exactInvoker持つものに相当findVirtualします。

<b>例:</b><ブロッククォート>

{@code
            import static java.lang.invoke.MethodHandles.*;
            import static java.lang.invoke.MethodType.*;
            ...
            MethodHandle MH_concat = publicLookup().findVirtual(String.class,
              "concat", methodType(String.class, String.class));
            MethodHandle MH_hashCode = publicLookup().findVirtual(Object.class,
              "hashCode", methodType(int.class));
            MethodHandle MH_hashCode_String = publicLookup().findVirtual(String.class,
              "hashCode", methodType(int.class));
            assertEquals("xy", (String) MH_concat.invokeExact("x", "y"));
            assertEquals("xy".hashCode(), (int) MH_hashCode.invokeExact((Object)"xy"));
            assertEquals("xy".hashCode(), (int) MH_hashCode_String.invokeExact("xy"));
            // interface method:
            MethodHandle MH_subSequence = publicLookup().findVirtual(CharSequence.class,
              "subSequence", methodType(CharSequence.class, int.class, int.class));
            assertEquals("def", MH_subSequence.invoke("abcdefghi", 3, 6).toString());
            // constructor "internal method" must be accessed differently:
            MethodType MT_newString = methodType(void.class); //()V for new String()
            try { assertEquals("impossible", lookup()
                    .findVirtual(String.class, "<init>", MT_newString));
             } catch (NoSuchMethodException ex) { } // OK
            MethodHandle MH_newString = publicLookup()
              .findConstructor(String.class, MT_newString);
            assertEquals("", (String) MH_newString.invokeExact());
            }

</blockquote>

の Java ドキュメントjava.lang.invoke.MethodHandles.Lookup.findVirtual(java.lang.Class<?>, java.lang.String, java.lang.invoke.MethodType)

このページの一部は、Android オープンソース プロジェクトによって作成および共有され、クリエイティブ コモンズ 2.5 属性ライセンスに記載されている条件に従って使用される作業に基づく変更です。

適用対象