Compartir a través de


MethodHandles.Lookup.FindVirtual(Class, String, MethodType) Método

Definición

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>

Documentación de Java para java.lang.invoke.MethodHandles.Lookup.findVirtual(java.lang.Class<?>, java.lang.String, java.lang.invoke.MethodType).

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.

Se aplica a