Langue

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

Définition

Produit un handle de méthode à liaison anticipée pour une méthode virtuelle.

[Android.Runtime.Register("findSpecial", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)]
public Java.Lang.Invoke.MethodHandle FindSpecial(Java.Lang.Class refc, string name, Java.Lang.Invoke.MethodType type, Java.Lang.Class specialCaller);
[<Android.Runtime.Register("findSpecial", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)>]
member this.FindSpecial : Java.Lang.Class * string * Java.Lang.Invoke.MethodType * Java.Lang.Class -> 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 (qui ne doit pas être " < init>")

type
MethodType

type de la méthode, avec l’argument récepteur omis

specialCaller
Class

la classe appelante proposée pour effectuer le invokespecial

Retours

handle de méthode souhaité

Attributs

Remarques

Produit un handle de méthode à liaison anticipée pour une méthode virtuelle. Il ignore les méthodes de substitution sur le récepteur, comme s’il est appelé à partir d’une invokespecial instruction à partir de l’instruction spécifiée specialCallerexplicitement. Le type du handle de méthode est celui de la méthode, avec un type de récepteur convenablement restreint précédé. (Le type de récepteur sera specialCaller ou un sous-type.) La méthode et tous ses types d’arguments doivent être accessibles à l’objet de recherche.

Avant la résolution de méthode, si la classe d’appelant spécifiée explicitement n’est pas identique à la classe de recherche, ou si cet objet de recherche n’a pas de privilèges d’accès privé, l’accès échoue.

Le handle de méthode retourné a MethodHandle#asVarargsCollector variable arity if and only if the variable arity modificateur bit () is0x0080 set.

<em>(Remarque : les méthodes internes JVM nommées "<init>" ne sont pas visibles par cette API, même si l’instruction invokespecial peut les faire référence dans des circonstances particulières. Permet #findConstructor findConstructor d’accéder aux méthodes d’initialisation d’instance de manière sécurisée.)</em>

<b>Example :</b><blockquote>

{@code
            import static java.lang.invoke.MethodHandles.*;
            import static java.lang.invoke.MethodType.*;
            ...
            static class Listie extends ArrayList {
              public String toString() { return "[wee Listie]"; }
              static Lookup lookup() { return MethodHandles.lookup(); }
            }
            ...
            // no access to constructor via invokeSpecial:
            MethodHandle MH_newListie = Listie.lookup()
              .findConstructor(Listie.class, methodType(void.class));
            Listie l = (Listie) MH_newListie.invokeExact();
            try { assertEquals("impossible", Listie.lookup().findSpecial(
                    Listie.class, "<init>", methodType(void.class), Listie.class));
             } catch (NoSuchMethodException ex) { } // OK
            // access to super and self methods via invokeSpecial:
            MethodHandle MH_super = Listie.lookup().findSpecial(
              ArrayList.class, "toString" , methodType(String.class), Listie.class);
            MethodHandle MH_this = Listie.lookup().findSpecial(
              Listie.class, "toString" , methodType(String.class), Listie.class);
            MethodHandle MH_duper = Listie.lookup().findSpecial(
              Object.class, "toString" , methodType(String.class), Listie.class);
            assertEquals("[]", (String) MH_super.invokeExact(l));
            assertEquals(""+l, (String) MH_this.invokeExact(l));
            assertEquals("[]", (String) MH_duper.invokeExact(l)); // ArrayList method
            try { assertEquals("inaccessible", Listie.lookup().findSpecial(
                    String.class, "toString", methodType(String.class), Listie.class));
             } catch (IllegalAccessException ex) { } // OK
            Listie subl = new Listie() { public String toString() { return "[subclass]"; } };
            assertEquals(""+l, (String) MH_this.invokeExact(subl)); // Listie method
            }

</blockquote>

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

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 à