語言

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

方法的類型,省略接收參數

傳回

所需方法的 handle

屬性

備註

產生虛擬方法的方法控制柄。 方法的句柄類型會依照方法本身的類型,接收器類型(通常 refc)會放在前面。 方法及其所有參數類型必須對查找物件可存取。

當被呼叫時,handle 會將第一個參數視為接收者,並派遣接收者型別來決定要輸入哪個方法實作。 (調度動作與 invokevirtual or invokeinterface 指令執行的動作相同。)

第一個參數若查詢類別擁有完整權限存取該成員,則為型別 refc 。 否則成員必須是, protected 且第一個參數的型別將被限制在查找類別內。

回傳的方法代柄將具有 MethodHandle#asVarargsCollector 變數元數,當且僅當該方法的變數元數修飾位0x0080元()被設定為 MethodHandle#asVarargsCollector。

由於指令與由 findVirtual產生的方法 handle 之間的invokevirtual一般等價性,若類別為 ,MethodHandle且名稱字串為 invokeExact 或 invoke,所得的方法 handle 等價於由 或 java.lang.invoke.MethodHandles#invoker MethodHandles.invoker 產生java.lang.invoke.MethodHandles#exactInvoker MethodHandles.exactInvoker的type相同參數。

<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());
            }

</區塊引用>

Java 文件 java.lang.invoke.MethodHandles.Lookup.findVirtual(java.lang.Class<?>, java.lang.String, java.lang.invoke.MethodType)。

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

適用於