Partager via


MethodHandles.Lookup.FindVirtual(Class, String, MethodType) Méthode

Définition

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>

Documentation Java pour java.lang.invoke.MethodHandles.Lookup.findVirtual(java.lang.Class<?>, java.lang.String, java.lang.invoke.MethodType).

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.

S’applique à