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

Definição

Produz um identificador de método de associação inicial para um 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

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

name
String

o nome do método (que não deve ser "< init>")

type
MethodType

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

specialCaller
Class

a classe de chamada proposta para executar o invokespecial

Retornos

o identificador de método desejado

Atributos

Comentários

Produz um identificador de método de associação inicial para um método virtual. Ele ignorará as verificações de substituição de métodos no receptor, como se fosse chamado de uma instrução invokespecial de dentro do especificado explicitamente specialCaller. O tipo do identificador do método será o do método, com um tipo de receptor adequadamente restrito prefixado. (O tipo de receptor será specialCaller ou um subtipo.) O método e todos os seus tipos de argumento devem ser acessíveis ao objeto de pesquisa.

Antes da resolução do método, se a classe de chamador explicitamente especificada não for idêntica à classe de pesquisa ou se esse objeto de pesquisa não tiver privilégios de acesso privado, o acesso falhará.

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

<em>(Observação: os métodos internos JVM nomeados "<init>" não são visíveis para essa API, mesmo que a invokespecial instrução possa se referir a eles em circunstâncias especiais. Use #findConstructor findConstructor para acessar métodos de inicialização de instância de maneira segura.)</em>

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

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

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

Aplica-se a