Proxy Classe
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.
Proxy fornece métodos estáticos para criar classes e instâncias de proxy dinâmico, e também é a superclasse de todas as classes de proxy dinâmico criadas por esses métodos.
[Android.Runtime.Register("java/lang/reflect/Proxy", DoNotGenerateAcw=true)]
public class Proxy : Java.Lang.Object, IDisposable, Java.IO.ISerializable
[<Android.Runtime.Register("java/lang/reflect/Proxy", DoNotGenerateAcw=true)>]
type Proxy = class
inherit Object
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- Herança
- Atributos
- Implementações
Comentários
Proxy fornece métodos estáticos para criar classes e instâncias de proxy dinâmico, e também é a superclasse de todas as classes de proxy dinâmico criadas por esses métodos.
Para criar um proxy para alguma interface Foo:
InvocationHandler handler = new MyInvocationHandler(...);
Class<?> proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), Foo.class);
Foo f = (Foo) proxyClass.getConstructor(InvocationHandler.class).
newInstance(handler);
ou mais simples:
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
new Class<?>[] { Foo.class },
handler);
Uma classe de proxy dinâmico (simplesmente conhecida como uma classe proxy abaixo) é uma classe que implementa uma lista de interfaces especificadas em runtime quando a classe é criada, com o comportamento conforme descrito abaixo.
Uma interface de proxy é uma interface que é implementada por uma classe proxy.
Uma instância de proxy é uma instância de uma classe proxy.
Cada instância de proxy tem um objeto de manipulador de invocação associado, que implementa a interface InvocationHandler. Uma invocação de método em uma instância de proxy por meio de uma de suas interfaces proxy será expedida para o InvocationHandler#invoke invoke método do manipulador de invocação da instância, passando a instância de proxy, um java.lang.reflect.Method objeto que identifica o método que foi invocado e uma matriz de tipo Object que contém os argumentos. O manipulador de invocação processa a invocação do método codificado conforme apropriado e o resultado que ele retorna será retornado como resultado da invocação do método na instância de proxy.
Uma classe proxy tem as seguintes propriedades:
<As classes de proxy ul><li>são <>públicas, finais e não abstratas</em> se todas as interfaces de proxy forem públicas.</li>
<as classes de proxy li>são <não>públicas, finais e não abstratas</em> se qualquer uma das interfaces de proxy não for pública.</li>
<li>O nome não qualificado de uma classe proxy não é especificado. No entanto, o espaço dos nomes de classe que começam com a cadeia "$Proxy" de caracteres deve ser reservado para classes proxy.
<a classe de proxy li>A se estende java.lang.reflect.Proxy.
<li>Uma classe proxy implementa exatamente as interfaces especificadas em sua criação, na mesma ordem.
<li>Se uma classe proxy implementar uma interface não pública, ela será definida no mesmo pacote que essa interface. Caso contrário, o pacote de uma classe proxy também não é especificado. Observe que a vedação de pacote não impedirá que uma classe proxy seja definida com êxito em um determinado pacote em runtime e nem as classes já definidas pelo mesmo carregador de classe e pelo mesmo pacote com signatários específicos.
<li>Uma vez que uma classe proxy implementa todas as interfaces especificadas em sua criação, invocar getInterfaces em seu Class objeto retornará uma matriz que contém a mesma lista de interfaces (na ordem especificada em sua criação), invocar getMethods em seu Class objeto retornará uma matriz de Method objetos que incluem todos os métodos nessas interfaces e invocar getMethod encontrará métodos nas interfaces de proxy, como seria esperado.
<li>O Proxy#isProxyClass Proxy.isProxyClass método retornará true se for passado uma classe proxy, uma classe retornada por Proxy.getProxyClass ou a classe de um objeto retornado por Proxy.newProxyInstance-- e false caso contrário.
<li>A java.security.ProtectionDomain classe de proxy é a mesma das classes do sistema carregadas pelo carregador de classe bootstrap, como java.lang.Object, porque o código para uma classe proxy é gerado pelo código do sistema confiável. Esse domínio de proteção normalmente será concedido java.security.AllPermission.
<li>Cada classe proxy tem um construtor público que usa um argumento, uma implementação da interface InvocationHandler, para definir o manipulador de invocação para uma instância de proxy. Em vez de precisar usar a API de reflexão para acessar o construtor público, uma instância de proxy também pode ser criada chamando o Proxy#newProxyInstance Proxy.newProxyInstance método, que combina as ações de chamada Proxy#getProxyClass Proxy.getProxyClass com a invocação do construtor com um manipulador de invocação.
</ul>
Uma instância de proxy tem as seguintes propriedades:
<ul><li>Dada uma instância proxy de proxy e uma das interfaces implementadas por sua classe Fooproxy, a expressão a seguir retornará true:
{@code proxy instanceof Foo}
e a seguinte operação de conversão será bem-sucedida (em vez de lançar um ClassCastException):
{@code (Foo) proxy}
<li>Cada instância de proxy tem um manipulador de invocação associado, aquele que foi passado para seu construtor. O método estático Proxy#getInvocationHandler Proxy.getInvocationHandler retornará o manipulador de invocação associado à instância de proxy passada como seu argumento.
<li>Uma invocação de método de interface em uma instância de proxy será codificada e enviada para o método do manipulador de InvocationHandler#invoke invoke invocação, conforme descrito na documentação desse método.
<li>Uma invocação do hashCodemétodo , equalsou toString métodos declarados em java.lang.Object uma instância de proxy serão codificados e expedidos para o método do manipulador de invocação da mesma maneira que as invocações do invoke método de interface são codificadas e expedidas, conforme descrito acima. A classe de declaração do Method objeto passado invoke será java.lang.Object. Outros métodos públicos de uma instância de java.lang.Object proxy herdada não são substituídos por uma classe proxy, portanto, invocações desses métodos se comportam como fazem para instâncias de java.lang.Object.
</ul>
<Métodos h3>duplicados em várias interfaces< de proxy/h3>
Quando duas ou mais interfaces de uma classe proxy contêm um método com o mesmo nome e assinatura de parâmetro, a ordem das interfaces da classe proxy se torna significativa. Quando esse método duplicado é invocado em uma instância de proxy, o Method objeto passado para o manipulador de invocação não será necessariamente aquele cuja classe de declaração é atribuível do tipo de referência da interface pela qual o método do proxy foi invocado. Essa limitação existe porque a implementação do método correspondente na classe proxy gerada não pode determinar por qual interface ela foi invocada. Portanto, quando um método duplicado é invocado em uma instância de proxy, o Method objeto do método na interface principal que contém o método (diretamente ou herdado por meio de uma superinterface) na lista de interfaces da classe proxy é passado para o método do manipulador de invoke invocação, independentemente do tipo de referência pelo qual a invocação do método ocorreu.
Se uma interface de proxy contiver um método com o mesmo nome e assinatura de parâmetro que o hashCode, equalsou toString métodos de java.lang.Object, quando esse método é invocado em uma instância de proxy, o Method objeto passado para o manipulador de invocação terá java.lang.Object como sua classe de declaração. Em outras palavras, os métodos públicos e não finais de java.lang.Object logicamente precedem todas as interfaces de proxy para a determinação de qual Method objeto passar para o manipulador de invocação.
Observe também que quando um método duplicado é expedido para um manipulador de invocação, o invoke método só pode gerar tipos de exceção verificados que podem ser atribuídos a um dos tipos de exceção na throws cláusula do método em todas as interfaces de proxy pelas quais ele pode ser invocado. Se o invoke método gerar uma exceção verificada que não é atribuível a nenhum dos tipos de exceção declarados pelo método em uma das interfaces de proxy pelas quais ele pode ser invocado, um desmarcado UndeclaredThrowableException será gerado pela invocação na instância de proxy. Essa restrição significa que nem todos os tipos de exceção retornados invocando getExceptionTypes o Method objeto passado para o invoke método podem necessariamente ser gerados com êxito pelo invoke método.
Adicionado em 1.3.
Java documentação para java.lang.reflect.Proxy.
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.
Construtores
| Nome | Description |
|---|---|
| Proxy(IInvocationHandler) |
Constrói uma nova |
| Proxy(IntPtr, JniHandleOwnership) |
Um construtor usado ao criar representações gerenciadas de objetos JNI; chamado pelo runtime. |
Propriedades
| Nome | Description |
|---|---|
| Class |
Retorna a classe de runtime deste |
| H |
o manipulador de invocação para essa instância de proxy. |
| Handle |
O identificador para a instância subjacente do Android. (Herdado de Object) |
| JniIdentityHashCode |
Obtém o código de hash de identidade atribuído a esse par Java pelo runtime de interoperabilidade. (Herdado de Object) |
| JniManagedPeerState |
|
| JniPeerMembers |
|
| PeerReference |
Obtém a referência de objeto JNI para este par Java. (Herdado de Object) |
| ThresholdClass |
Essa API dá suporte à infraestrutura do Mono para Android e não se destina a ser usada diretamente do seu código. |
| ThresholdType |
Essa API dá suporte à infraestrutura do Mono para Android e não se destina a ser usada diretamente do seu código. |
Métodos
| Nome | Description |
|---|---|
| Clone() |
Cria e retorna uma cópia desse objeto. (Herdado de Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
|
| Dispose() |
Libera os recursos mantidos por esse par Java. (Herdado de Object) |
| Dispose(Boolean) |
Libera os recursos mantidos por esse par Java. (Herdado de Object) |
| DisposeUnlessReferenced() |
|
| Equals(Object) |
|
| Equals(Object) |
Indica se algum outro objeto é "igual a" este. (Herdado de Object) |
| GetHashCode() |
Retorna um valor de código hash para o objeto. (Herdado de Object) |
| GetInvocationHandler(Object) |
Retorna o manipulador de invocação para a instância de proxy especificada. |
| GetProxyClass(ClassLoader, Class[]) |
Retorna o |
| IsProxyClass(Class) |
Retorna true se e somente se a classe especificada foi gerada dinamicamente para ser uma classe proxy usando o |
| JavaFinalize() |
Chamado pelo coletor de lixo em um objeto quando a coleta de lixo determina que não há mais referências ao objeto. (Herdado de Object) |
| NewProxyInstance(ClassLoader, Class[], IInvocationHandler) |
Retorna uma instância de uma classe proxy para as interfaces especificadas que expedi invocações de método para o manipulador de invocação especificado. |
| Notify() |
Ativa um único thread que está aguardando no monitor deste objeto. (Herdado de Object) |
| NotifyAll() |
Ativa todos os threads que estão aguardando no monitor deste objeto. (Herdado de Object) |
| SetHandle(IntPtr, JniHandleOwnership) |
Define a propriedade Handle (Herdado de Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
|
| ToArray<T>() |
Cria uma matriz gerenciada com base nesse wrapper de matriz Java. (Herdado de Object) |
| ToString() |
Retorna uma representação de cadeia de caracteres do objeto. (Herdado de Object) |
| UnregisterFromRuntime() |
Cancela o registro desse par Java do runtime de interoperabilidade. (Herdado de Object) |
| Wait() |
Faz com que o thread atual aguarde até ser despertado, normalmente por ser <notificado/em> ou <em>interrompido</em>.<> (Herdado de Object) |
| Wait(Int64, Int32) |
Faz com que o thread atual aguarde até que ele seja despertado, normalmente por ser <>notificado</em> ou <em>interrompido</em>, ou até que uma determinada quantidade de tempo real tenha decorrido. (Herdado de Object) |
| Wait(Int64) |
Faz com que o thread atual aguarde até que ele seja despertado, normalmente por ser <>notificado</em> ou <em>interrompido</em>, ou até que uma determinada quantidade de tempo real tenha decorrido. (Herdado de Object) |
Implantações explícitas de interface
| Nome | Description |
|---|---|
| IJavaPeerable.Disposed() |
|
| IJavaPeerable.Finalized() |
|
| IJavaPeerable.JniObjectReferenceControlBlock |
|
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
|
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
|
| IJavaPeerable.SetPeerReference(JniObjectReference) |
|
| IJavaPeerable.UnregisterFromRuntime() |
|
Métodos de Extensão
| Nome | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
Obtém o nome JNI do tipo da instância |
| JavaAs<TResult>(IJavaPeerable) |
Tente coagir a digitar |
| JavaCast<TResult>(IJavaObject) |
Executa uma conversão de tipo marcada por runtime do Android. |
| JavaCast<TResult>(IJavaObject) |
|
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Tente coagir a digitar |