Partilhar via


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

Definição

Produz um identificador de método para um 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

A classe ou interface a partir da qual o método é acessado

name
String

O nome do método

type
MethodType

o tipo do método, com o argumento receiver omitido

Retornos

o identificador de método desejado

Atributos

Comentários

Produz um identificador de método para um método virtual. O tipo do identificador do método será o do método, com o tipo receptor (geralmente refc) pendente. O método e todos os seus tipos de argumento devem ser acessíveis ao objeto de pesquisa.

Quando chamado, o identificador tratará o primeiro argumento como um receptor e despachará no tipo do receptor para determinar qual implementação de método inserir. (A ação de despacho é idêntica à executada por uma invokevirtual instrução ou invokeinterface instrução.)

O primeiro argumento será do tipo refc se a classe de pesquisa tiver privilégios totais para acessar o membro. Caso contrário, o membro deve ser protected e o primeiro argumento será restrito em tipo à classe de pesquisa.

O identificador de método retornado terá arity da variável MethodHandle#asVarargsCollector se e somente se o bit modificador de arity variável do método (0x0080) estiver definido.

Devido à equivalência geral entre invokevirtual instruções e identificadores de método produzidos por findVirtual, se a classe é MethodHandle e a cadeia de caracteres de nome é invokeExact ou invoke, o identificador de método resultante é equivalente a um produzido por java.lang.invoke.MethodHandles#exactInvoker MethodHandles.exactInvoker ou java.lang.invoke.MethodHandles#invoker MethodHandles.invoker com o mesmo type argumento.

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

Documentação Java para java.lang.invoke.MethodHandles.Lookup.findVirtual(java.lang.Class<?>, java.lang.String, java.lang.invoke.MethodType).

Partes desta página são modificações baseadas no trabalho criado e compartilhado pelo Android Open Source Project e usado de acordo com os termos descritos na Creative Commons 2.5 Attribution License.

Aplica-se a