MethodHandles.Lookup.FindVirtual(Class, String, MethodType) 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 Methodenhandle für eine virtuelle Methode.
[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
Parameter
- refc
- Class
die Klasse oder Schnittstelle, von der aus auf die Methode zugegriffen wird
- name
- String
der Name der Methode
- type
- MethodType
der Typ der Methode, wobei das Empfängerargument weggelassen wird
Gibt zurück
das gewünschte Methodenhandle
- Attribute
Hinweise
Erzeugt ein Methodenhandle für eine virtuelle Methode. Der Typ des Methodenhandles ist die der Methode, wobei der Empfängertyp (in der Regel refc
) vorangestellt ist. Auf die Methode und alle zugehörigen Argumenttypen muss für das Nachschlageobjekt zugegriffen werden kann.
Beim Aufrufen behandelt das Handle das erste Argument als Empfänger und verteilt auf den Empfängertyp, um zu bestimmen, welche Methodenimplementierung eingegeben werden soll. (Die Verteileraktion ist identisch mit der, die von einer oder invokeinterface
einer invokevirtual
Anweisung ausgeführt wird.)
Das erste Argument ist vom Typ refc
, wenn die Nachschlageklasse über vollständige Berechtigungen für den Zugriff auf das Element verfügt. Andernfalls muss das Element sein protected
, und das erste Argument wird im Typ auf die Nachschlageklasse beschränkt.
Der zurückgegebene Methodenhandle weist die Variable MethodHandle#asVarargsCollector auf, wenn und nur dann, wenn der Variablenvariablen-Modifizierer bit (0x0080
) der Methode festgelegt ist.
Aufgrund der allgemeinen Äquivalenz zwischen invokevirtual
Anweisungen und Methodenhandles, die von findVirtual
, wenn die Klasse ist und die Namenszeichenfolge ist MethodHandle
invokeExact
oder invoke
, entspricht der resultierende Methodenhandle einem, das von java.lang.invoke.MethodHandles#exactInvoker MethodHandles.exactInvoker
oder java.lang.invoke.MethodHandles#invoker MethodHandles.invoker
mit demselben type
Argument erzeugt wird.
<b>Beispiel:</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>
Teile dieser Seite sind Änderungen auf der Grundlage von Arbeiten, die vom Android Open Source-Projekt erstellt und freigegeben werden und gemäß den in der Creative Commons 2.5 Attribution License beschriebenen Begriffen verwendet werden.