MethodHandles.Lookup.FindVirtual(Class, String, MethodType) Méthode
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Produit un handle de méthode pour une méthode virtuelle.
[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
Paramètres
- refc
- Class
la classe ou l’interface à partir de laquelle la méthode est accessible
- name
- String
nom de la méthode
- type
- MethodType
type de la méthode, avec l’argument récepteur omis
Retours
handle de méthode souhaité
- Attributs
Remarques
Produit un handle de méthode pour une méthode virtuelle. Le type du handle de méthode est celui de la méthode, avec le type de récepteur (généralement refc
) ajouté. La méthode et tous ses types d’arguments doivent être accessibles à l’objet de recherche.
Lorsqu’il est appelé, le handle traite le premier argument en tant que récepteur et réparti sur le type du récepteur pour déterminer l’implémentation de méthode à entrer. (L’action de répartition est identique à celle effectuée par une invokevirtual
ou invokeinterface
une instruction.)
Le premier argument sera de type refc
si la classe de recherche dispose de privilèges complets pour accéder au membre. Sinon, le membre doit être protected
et le premier argument est limité en type à la classe de recherche.
Le handle de méthode retourné a MethodHandle#asVarargsCollector variable arity if and only if the variable arity modificateur bit () is0x0080
set.
En raison de l’équivalence générale entre invokevirtual
les instructions et les handles de méthode générés par findVirtual
, si la classe est MethodHandle
et que la chaîne de nom est invokeExact
ou invoke
, le handle de méthode résultant est équivalent à un de ceux produits par java.lang.invoke.MethodHandles#exactInvoker MethodHandles.exactInvoker
ou java.lang.invoke.MethodHandles#invoker MethodHandles.invoker
avec le même type
argument.
<b>Example :</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>
Les parties de cette page sont des modifications basées sur le travail créé et partagé par le projet Android Open Source et utilisés en fonction des termes décrits dans la licence d’attribution Creative Commons 2.5.