Lingua

MethodHandles.Lookup.FindSpecial(Class, String, MethodType, Class) Metodo

Definizione

Produce un handle di metodo con associazione anticipata per un metodo virtuale.

[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

Parametri

refc
Class

classe o interfaccia a cui si accede al metodo

name
String

nome del metodo (che non deve essere "< init>")

type
MethodType

il tipo del metodo, con l'argomento ricevitore omesso

specialCaller
Class

classe chiamante proposta per eseguire invokespecial

Valori restituiti

handle del metodo desiderato

Attributi

Commenti

Produce un handle di metodo con associazione anticipata per un metodo virtuale. Ignora i controlli per l'override dei metodi nel ricevitore, come se chiamato da un'istruzione invokespecial dall'interno dell'oggetto specificato specialCallerin modo esplicito. Il tipo dell'handle del metodo sarà quello del metodo, con un tipo di ricevitore con restrizioni adeguato anteporto. Il tipo di ricevitore sarà specialCaller o un sottotipo. Il metodo e tutti i relativi tipi di argomento devono essere accessibili all'oggetto di ricerca.

Prima della risoluzione del metodo, se la classe chiamante specificata in modo esplicito non è identica alla classe di ricerca o se questo oggetto di ricerca non dispone di privilegi di accesso privato, l'accesso non riesce.

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).

<em>(Nota: i metodi interni JVM denominati "<init>" non sono visibili a questa API, anche se l'istruzione invokespecial può farvi riferimento in circostanze speciali. Usare #findConstructor findConstructor per accedere ai metodi di inizializzazione dell'istanza in modo sicuro.</em>

<b>Esempio:</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>

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

Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dalla e usati in base ai termini descritti in Creative License 2.5 Attribution License.

Si applica a