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
方法的類型,省略接收參數
傳回
所需方法的 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());
}
</區塊引用>
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。