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

メソッドの名前 ("< にすることはできません。init>")

type
MethodType

メソッドの型(受信側引数を省略)

specialCaller
Class

を実行するために提案された呼び出し元クラス invokespecial

返品

目的のメソッド ハンドル

属性

注釈

仮想メソッドの早期バインド メソッド ハンドルを生成します。 明示的に指定されたspecialCaller内からinvokespecial命令から呼び出された場合と同様に、受信側でメソッドをオーバーライドするためのチェックがバイパスされます。 メソッド ハンドルの型は、適切に制限された受信側の型の前に付加されたメソッドの型になります。 (受信側の種類は specialCaller またはサブタイプになります)。メソッドとそのすべての引数型には、参照オブジェクトからアクセスできる必要があります。

メソッド解決の前に、明示的に指定された呼び出し元クラスが参照クラスと同じでない場合、またはこの参照オブジェクトにプライベート アクセス権限がない場合、アクセスは失敗します。

メソッドの変数アリティ修飾子ビット (0x0080) が設定されている場合にのみ、返されるメソッド ハンドルには MethodHandle#asVarargsCollector 変数アリティがあります。

<em>(注: "<init>" という名前の JVM 内部メソッドは、 invokespecial 命令が特殊な状況でそれらを参照できますが、この API には表示されません。 #findConstructor findConstructor を使用して、インスタンス初期化メソッドに安全な方法でアクセスします。)</em>

<b>Example:</b><blockquote>

{@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
            }

</blockquote>

Javaドキュメント。

このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。

適用対象