Freigeben über


MethodHandles.Lookup.FindVirtual(Class, String, MethodType) Methode

Definition

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>

Java-Dokumentation für java.lang.invoke.MethodHandles.Lookup.findVirtual(java.lang.Class<?>, java.lang.String, java.lang.invoke.MethodType).

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.

Gilt für: