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
) 前面加上 。 方法及其所有自變數類型都必須可供查閱物件存取。
呼叫時,句柄會將第一個自變數視為接收者,並在接收者的型別上分派,以判斷要輸入的方法實作。 (分派動作與 或 invokeinterface
指令所invokevirtual
執行的動作相同。
如果查閱類別具有存取成員的完整許可權,則第一個自變數的類型為 refc
。 否則,成員必須是 protected
,且第一個自變數的類型會限制為查閱類別。
傳回的方法句柄只有在方法的arity修飾詞位 (0x0080
) 設定時,才會有 MethodHandle#asVarargsCollector 變數 arity。
由於 指令與方法句柄之間的invokevirtual
一般等價,如果類別是 且名稱字串為 invokeExact
MethodHandle
或 invoke
,則產生的方法句柄findVirtual
相當於 或 java.lang.invoke.MethodHandles#exactInvoker MethodHandles.exactInvoker
java.lang.invoke.MethodHandles#invoker MethodHandles.invoker
具有相同type
自變數所產生的句柄。
<b>範例:</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>
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。