MethodHandles.Lookup.FindSpecial(Class, String, MethodType, Class) Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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>
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.