語言

MethodHandles.Lookup.FindSpecial(Class, String, MethodType, Class) 方法

定義

產生虛擬方法的早期綁定方法句柄。

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

參數

refc
Class

存取該方法的類別或介面

name
String

方法名稱(不得為「“)

type
MethodType

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

specialCaller
Class

所提議的呼叫類別以執行 invokespecial

傳回

所需方法的 handle

屬性

備註

產生虛擬方法的早期綁定方法句柄。 它會繞過接收端覆寫方法的檢查,就像從 invokespecial 明確指定的 specialCaller指令中呼叫一樣。 方法控制柄的類型會依照方法本身,並會加上適當受限的接收器類型。 (接收器類型為 specialCaller 或子類型。)方法及其所有參數類型必須對查找物件可存取。

在方法解析前,若明確指定的呼叫類別與查找類別不相同,或該查詢物件沒有私有存取權限,該存取將失敗。

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

<em>(註:JVM 內部方法 "<init>" 對此 API 不可見,儘管 invokespecial 指令在特殊情況下可參考。用以 #findConstructor findConstructor 安全的方式存取實例初始化方法。)</em>

<b>範例:</b><引用>

{@code
            import static java.lang.invoke.MethodHandles.*;
            import static java.lang.invoke.MethodType.*;
            ...
            static class Listie extends ArrayList {
              public String toString() { return "[wee Listie]"; }
              static Lookup lookup() { return MethodHandles.lookup(); }
            }
            ...
            // no access to constructor via invokeSpecial:
            MethodHandle MH_newListie = Listie.lookup()
              .findConstructor(Listie.class, methodType(void.class));
            Listie l = (Listie) MH_newListie.invokeExact();
            try { assertEquals("impossible", Listie.lookup().findSpecial(
                    Listie.class, "<init>", methodType(void.class), Listie.class));
             } catch (NoSuchMethodException ex) { } // OK
            // access to super and self methods via invokeSpecial:
            MethodHandle MH_super = Listie.lookup().findSpecial(
              ArrayList.class, "toString" , methodType(String.class), Listie.class);
            MethodHandle MH_this = Listie.lookup().findSpecial(
              Listie.class, "toString" , methodType(String.class), Listie.class);
            MethodHandle MH_duper = Listie.lookup().findSpecial(
              Object.class, "toString" , methodType(String.class), Listie.class);
            assertEquals("[]", (String) MH_super.invokeExact(l));
            assertEquals(""+l, (String) MH_this.invokeExact(l));
            assertEquals("[]", (String) MH_duper.invokeExact(l)); // ArrayList method
            try { assertEquals("inaccessible", Listie.lookup().findSpecial(
                    String.class, "toString", methodType(String.class), Listie.class));
             } catch (IllegalAccessException ex) { } // OK
            Listie subl = new Listie() { public String toString() { return "[subclass]"; } };
            assertEquals(""+l, (String) MH_this.invokeExact(subl)); // Listie method
            }

</區塊引用>

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

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

適用於