MethodHandles.Lookup.FindSpecial(Class, String, MethodType, Class) Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
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>
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.