MethodHandles.Lookup.FindSpecial(Class, String, MethodType, Class) Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Genera un identificador de método enlazado en tiempo de ejecución para un método virtual.
[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
Parámetros
- refc
- Class
clase o interfaz desde la que se accede al método
- name
- String
el nombre del método (que no debe ser "< init>")
- type
- MethodType
el tipo del método , con el argumento receiver omitido
- specialCaller
- Class
la clase de llamada propuesta para realizar el invokespecial
Devoluciones
el identificador de método deseado
- Atributos
Comentarios
Genera un identificador de método enlazado en tiempo de ejecución para un método virtual. Omitirá las comprobaciones de invalidación de métodos en el receptor, como si se llamara desde una invokespecial instrucción desde dentro del especificado specialCallerexplícitamente. El tipo del identificador de método será el del método, con un tipo de receptor adecuadamente restringido antepuesto. (El tipo de receptor será specialCaller o un subtipo). El método y todos sus tipos de argumentos deben ser accesibles para el objeto de búsqueda.
Antes de la resolución de métodos, si la clase de llamador especificada explícitamente no es idéntica a la clase de búsqueda, o si este objeto de búsqueda no tiene privilegios de acceso privado, se produce un error en el acceso.
El identificador de método devuelto tendrá la aridad de variable MethodHandle#asVarargsCollector si y solo si se establece el bit modificador de arity de la variable del método (0x0080).
<em>(Nota: Los métodos internos de JVM denominados "<init>" no son visibles para esta API, aunque la invokespecial instrucción puede hacer referencia a ellos en circunstancias especiales. Use #findConstructor findConstructor para acceder a los métodos de inicialización de instancia de forma segura).</em>
<b>Ejemplo:</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>
Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el Android y se usan según los términos descritos en creative Creative Commons 2.5 Attribution License.