MethodHandles.Lookup.FindVirtual(Class, String, MethodType) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
仮想メソッドのメソッド ハンドルを生成します。
[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) が先頭に付加されます。 メソッドとそのすべての引数型には、参照オブジェクトからアクセスできる必要があります。
呼び出されると、ハンドルは最初の引数を受信側として扱い、受信側の型にディスパッチして、入力するメソッドの実装を決定します。 (ディスパッチ アクションは、 invokevirtual または invokeinterface 命令によって実行されるアクションと同じです)。
ルックアップ クラスがメンバーにアクセスするための完全な権限を持っている場合、最初の引数は refc 型になります。 それ以外の場合、メンバーは protected する必要があり、最初の引数は型で参照クラスに制限されます。
メソッドの変数アリティ修飾子ビット (0x0080) が設定されている場合にのみ、返されるメソッド ハンドルには MethodHandle#asVarargsCollector 変数アリティがあります。
invokevirtual命令とfindVirtualによって生成されるメソッド ハンドルの一般的な等価性のため、クラスがMethodHandleされ、名前文字列がinvokeExactまたはinvokeの場合、結果のメソッド ハンドルは、同じtype引数を持つjava.lang.invoke.MethodHandles#exactInvoker MethodHandles.exactInvokerまたはjava.lang.invoke.MethodHandles#invoker MethodHandles.invokerによって生成されたものと同じです。
<b>Example:</b><blockquote>
{@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>
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。