MethodHandles.Lookup.FindSpecial(Class, String, MethodType, Class) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
仮想メソッドの事前バインドされたメソッド ハンドルを生成します。
[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
戻り値
目的のメソッド ハンドル
- 属性
注釈
仮想メソッドの事前バインドされたメソッド ハンドルを生成します。 明示的に指定された 内から命令から呼び出された場合と同様に、受信側でメソッドを invokespecial
オーバーライドするためのチェックはバイパスされます specialCaller
。 メソッド ハンドルの型は メソッドの型であり、適切に制限されたレシーバー型が付加されます。 (受信側の種類は または サブタイプになります specialCaller
)。メソッドとそのすべての引数型には、参照オブジェクトからアクセスできる必要があります。
メソッド解決の前に、明示的に指定された呼び出し元クラスが参照クラスと同一でない場合、またはこの参照オブジェクトにプライベート アクセス特権がない場合、アクセスは失敗します。
メソッドの変数アリティ修飾子ビット (0x0080
) が設定されている場合にのみ、返されるメソッド ハンドルには MethodHandle#asVarargsCollector 変数アリティがあります。 <p style="font-size:smaller;"><em>(注: という名前"<init>"
の JVM 内部メソッドは、特別な状況では命令で参照できますが、invokespecial
この API では参照できません。インスタンス初期化メソッドに安全な方法<でアクセスするには、 を使用#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
}
</blockquote>
このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。