MethodHandles.Lookup.FindVirtual(Class, String, MethodType) 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 para un método virtual.
[Android.Runtime.Register("findVirtual", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)]
public Java.Lang.Invoke.MethodHandle FindVirtual (Java.Lang.Class refc, string name, Java.Lang.Invoke.MethodType type);
[<Android.Runtime.Register("findVirtual", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)>]
member this.FindVirtual : Java.Lang.Class * string * Java.Lang.Invoke.MethodType -> 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
- type
- MethodType
el tipo del método , con el argumento receiver omitido
Devoluciones
el identificador de método deseado
- Atributos
Comentarios
Genera un identificador de método para un método virtual. El tipo del identificador de método será el del método, con el tipo de receptor (normalmente refc
) antepuesto. El método y todos sus tipos de argumentos deben ser accesibles para el objeto de búsqueda.
Cuando se llama, el identificador tratará el primer argumento como receptor y se enviará en el tipo del receptor para determinar qué implementación de método se va a especificar. (La acción de distribución es idéntica a la realizada por una invokevirtual
instrucción o invokeinterface
).
El primer argumento será de tipo refc
si la clase de búsqueda tiene privilegios completos para acceder al miembro. De lo contrario, el miembro debe ser protected
y el primer argumento se restringirá en el tipo a la clase de búsqueda.
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
).
Debido a la equivalencia general entre invokevirtual
instrucciones y identificadores de método generados por findVirtual
, si la clase es MethodHandle
y la cadena de nombre es invokeExact
o invoke
, el identificador de método resultante es equivalente a uno generado por java.lang.invoke.MethodHandles#exactInvoker MethodHandles.exactInvoker
o java.lang.invoke.MethodHandles#invoker MethodHandles.invoker
con el mismo type
argumento.
<b>Ejemplo:</b><blockquote>
{@code
import static java.lang.invoke.MethodHandles.*;
import static java.lang.invoke.MethodType.*;
...
MethodHandle MH_concat = publicLookup().findVirtual(String.class,
"concat", methodType(String.class, String.class));
MethodHandle MH_hashCode = publicLookup().findVirtual(Object.class,
"hashCode", methodType(int.class));
MethodHandle MH_hashCode_String = publicLookup().findVirtual(String.class,
"hashCode", methodType(int.class));
assertEquals("xy", (String) MH_concat.invokeExact("x", "y"));
assertEquals("xy".hashCode(), (int) MH_hashCode.invokeExact((Object)"xy"));
assertEquals("xy".hashCode(), (int) MH_hashCode_String.invokeExact("xy"));
// interface method:
MethodHandle MH_subSequence = publicLookup().findVirtual(CharSequence.class,
"subSequence", methodType(CharSequence.class, int.class, int.class));
assertEquals("def", MH_subSequence.invoke("abcdefghi", 3, 6).toString());
// constructor "internal method" must be accessed differently:
MethodType MT_newString = methodType(void.class); //()V for new String()
try { assertEquals("impossible", lookup()
.findVirtual(String.class, "<init>", MT_newString));
} catch (NoSuchMethodException ex) { } // OK
MethodHandle MH_newString = publicLookup()
.findConstructor(String.class, MT_newString);
assertEquals("", (String) MH_newString.invokeExact());
}
</blockquote>
Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el proyecto de código abierto de Android y se usan según los términos descritos en la licencia de atribución de Creative Commons 2.5.