MethodHandles.Lookup.FindSpecial(Class, String, MethodType, Class) 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 à 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>
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.