Condividi tramite


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

Definizione

Produce un handle di metodo per un metodo virtuale.

[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

Parametri

refc
Class

classe o interfaccia a cui si accede al metodo

name
String

nome del metodo

type
MethodType

il tipo del metodo, con l'argomento ricevitore omesso

Restituisce

handle del metodo desiderato

Attributi

Commenti

Produce un handle di metodo per un metodo virtuale. Il tipo dell'handle del metodo sarà quello del metodo, con il tipo di ricevitore (in genere refc) anteporto. Il metodo e tutti i relativi tipi di argomento devono essere accessibili all'oggetto di ricerca.

Quando viene chiamato, l'handle considera il primo argomento come ricevitore e invia sul tipo del ricevitore per determinare quale implementazione del metodo immettere. L'azione di invio è identica a quella eseguita da un'istruzione invokevirtual o invokeinterface .

Il primo argomento sarà di tipo refc se la classe di ricerca ha privilegi completi per accedere al membro. In caso contrario, il membro deve essere protected e il primo argomento verrà limitato nel tipo alla classe di ricerca.

L'handle del metodo restituito avrà la variabile MethodHandle#asVarargsCollector se e solo se è impostato il bit del modificatore di arità della variabile del metodo (0x0080).

A causa dell'equivalenza generale tra invokevirtual istruzioni e handle di metodo prodotti da findVirtual, se la classe è MethodHandle e la stringa del nome è invokeExact o invoke, l'handle del metodo risultante è equivalente a uno prodotto da java.lang.invoke.MethodHandles#exactInvoker MethodHandles.exactInvoker o java.lang.invoke.MethodHandles#invoker MethodHandles.invoker con lo stesso type argomento.

<b>Esempio:</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>

Documentazione java per java.lang.invoke.MethodHandles.Lookup.findVirtual(java.lang.Class<?>, java.lang.String, java.lang.invoke.MethodType).

Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dal progetto Open Source Android e usato in base ai termini descritti nella licenza Creative Commons 2.5 Attribuzione.

Si applica a