MethodHandles.Lookup.FindSpecial(Class, String, MethodType, Class) Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Erzeugt ein früh gebundenes Methodenhandle für eine virtuelle Methode.
[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
Parameter
- refc
- Class
die Klasse oder Schnittstelle, von der aus auf die Methode zugegriffen wird
- name
- String
der Name der Methode (die nicht "< init>")
- type
- MethodType
der Typ der Methode, wobei das Empfängerargument weggelassen wird
- specialCaller
- Class
die vorgeschlagene aufrufende Klasse zum Ausführen der invokespecial
Gibt zurück
das gewünschte Methodenhandle
- Attribute
Hinweise
Erzeugt ein früh gebundenes Methodenhandle für eine virtuelle Methode. Es wird Überprüfungen auf Außerkraftsetzungsmethoden für den Empfänger umgangen, als ob von einer invokespecial Anweisung innerhalb der explizit angegebenen specialCalleraufgerufen wird. Der Typ des Methodenhandles ist die der Methode, wobei ein entsprechend eingeschränkter Empfängertyp vorangestellt ist. (Der Empfängertyp ist specialCaller oder ein Untertyp.) Auf die Methode und alle zugehörigen Argumenttypen muss für das Nachschlageobjekt zugegriffen werden kann.
Wenn die explizit angegebene Aufruferklasse nicht mit der Nachschlageklasse identisch ist oder dieses Nachschlageobjekt nicht über private Zugriffsberechtigungen verfügt, schlägt der Zugriff fehl.
Der zurückgegebene Methodenhandle weist die Variable MethodHandle#asVarargsCollector auf, wenn und nur dann, wenn der Variablenvariablen-Modifizierer bit (0x0080) der Methode festgelegt ist.
<em>(Hinweis: Die benannten "<init>" internen JVM-Methoden sind für diese API nicht sichtbar, obwohl die invokespecial Anweisung unter besonderen Umständen darauf verweisen kann. Verwenden Sie #findConstructor findConstructor diese Methode, um auf sichere Weise auf Instanzinitialisierungsmethoden zuzugreifen.)</em>
<b>Beispiel:</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>
Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die von der Android Open Source Project erstellt und gemeinsam verwendet und gemäß den in der 2.5 Attribution License beschriebenen Begriffen verwendet werden.