MethodHandles.Lookup.FindVirtual(Class, String, MethodType) Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
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>
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.