Proxy Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Proxy
proporciona métodos estáticos para crear clases y instancias de proxy dinámicos, y también es la superclase de todas las clases de proxy dinámicos creadas por esos métodos.
[Android.Runtime.Register("java/lang/reflect/Proxy", DoNotGenerateAcw=true)]
public class Proxy : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, 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
- Herencia
- Atributos
- Implementaciones
Comentarios
Proxy
proporciona métodos estáticos para crear clases y instancias de proxy dinámicos, y también es la superclase de todas las clases de proxy dinámicos creadas por esos métodos.
Para crear un proxy para alguna interfaz Foo
:
InvocationHandler handler = new MyInvocationHandler(...);
Class<?> proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), Foo.class);
Foo f = (Foo) proxyClass.getConstructor(InvocationHandler.class).
newInstance(handler);
o más simplemente:
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
new Class<?>[] { Foo.class },
handler);
Una clase de proxy dinámico (simplemente denominada clase de proxy a continuación) es una clase que implementa una lista de interfaces especificadas en tiempo de ejecución cuando se crea la clase, con un comportamiento como se describe a continuación.
Una interfaz de proxy es una interfaz de este tipo que se implementa mediante una clase de proxy.
Una instancia de proxy es una instancia de una clase de proxy.
Cada instancia de proxy tiene un objeto de controlador de invocación asociado, que implementa la interfaz InvocationHandler
. Una invocación de método en una instancia de proxy a través de una de sus interfaces de proxy se enviará al InvocationHandler#invoke invoke
método del controlador de invocación de la instancia, pasando la instancia de proxy, un java.lang.reflect.Method
objeto que identifica el método que se invocó y una matriz de tipo Object
que contiene los argumentos. El controlador de invocación procesa la invocación del método codificado según corresponda y el resultado que devuelve se devolverá como resultado de la invocación del método en la instancia de proxy.
Una clase de proxy tiene las siguientes propiedades:
<Las clases ul><li>Proxy son <públicas>, finales y no abstractas</em> si todas las interfaces de proxy son públicas.</Li>
<las clases de proxy li>son <no>públicas, finales y no abstractas</em> si alguna de las interfaces de proxy no es pública.</Li>
<li>El nombre no completo de una clase de proxy no se especifica. Sin embargo, el espacio de nombres de clase que comienzan con la cadena "$Proxy"
debe estar reservado para las clases de proxy.
<li>Una clase de proxy extiende java.lang.reflect.Proxy
.
<li>Una clase de proxy implementa exactamente las interfaces especificadas en su creación, en el mismo orden.
<li>Si una clase de proxy implementa una interfaz no pública, se definirá en el mismo paquete que esa interfaz. De lo contrario, tampoco se especifica el paquete de una clase de proxy. Tenga en cuenta que el sellado de paquetes no impedirá que una clase de proxy se defina correctamente en un paquete determinado en tiempo de ejecución y ninguna de las clases ya definidas por el mismo cargador de clases y el mismo paquete con firmantes concretos.
<li>Dado que una clase de proxy implementa todas las interfaces especificadas en su creación, la invocación getInterfaces
en su Class
objeto devolverá una matriz que contenga la misma lista de interfaces (en el orden especificado en su creación), invocar getMethods
en su Class
objeto devolverá una matriz de Method
objetos que incluyan todos los métodos en esas interfaces y la invocación getMethod
buscará métodos en las interfaces proxy como se esperaría.
<li>El Proxy#isProxyClass Proxy.isProxyClass
método devolverá true si se pasa una clase de proxy( una clase devuelta por Proxy.getProxyClass
o la clase de un objeto devuelto por Proxy.newProxyInstance
- y false en caso contrario.
<li>La java.security.ProtectionDomain
clase de proxy es la misma que la de las clases del sistema cargadas por el cargador de clases de arranque, como java.lang.Object
, porque el código de una clase de proxy se genera mediante código de sistema de confianza. Normalmente, a este dominio de protección se le concederá java.security.AllPermission
.
<li>Cada clase de proxy tiene un constructor público que toma un argumento, una implementación de la interfaz InvocationHandler
, para establecer el controlador de invocación para una instancia de proxy. En lugar de tener que usar la API de reflexión para acceder al constructor público, también se puede crear una instancia de proxy mediante una llamada al Proxy#newProxyInstance Proxy.newProxyInstance
método , que combina las acciones de llamada Proxy#getProxyClass Proxy.getProxyClass
con la invocación del constructor con un controlador de invocación. </ul>
Una instancia de proxy tiene las siguientes propiedades:
<ul><li>Dado una instancia proxy
de proxy y una de las interfaces implementadas por su clase Foo
de proxy, la siguiente expresión devolverá true:
{@code proxy instanceof Foo}
y la siguiente operación de conversión se realizará correctamente (en lugar de iniciar ):ClassCastException
{@code (Foo) proxy}
<li>Cada instancia de proxy tiene un controlador de invocación asociado, el que se pasó a su constructor. El método estático Proxy#getInvocationHandler Proxy.getInvocationHandler
devolverá el controlador de invocación asociado a la instancia de proxy que se pasa como argumento.
<li>Una invocación de método de interfaz en una instancia de proxy se codificará y enviará al método del InvocationHandler#invoke invoke
controlador de invocación, tal como se describe en la documentación de ese método.
<li>Una invocación de los hashCode
métodos , equals
o toString
declarados en en java.lang.Object
una instancia de proxy se codificará y enviará al método del invoke
controlador de invocación de la misma manera que las invocaciones de método de interfaz se codifican y envían, como se ha descrito anteriormente. La clase declarante del Method
objeto pasado a invoke
será java.lang.Object
. Otros métodos públicos de una instancia de proxy heredada de java.lang.Object
no se invalidan mediante una clase de proxy, por lo que las invocaciones de esos métodos se comportan como lo hacen para instancias de java.lang.Object
. </ul>
<h3>Métodos duplicados en varias interfaces< de proxy/h3>
Cuando dos o más interfaces de una clase de proxy contienen un método con el mismo nombre y la misma firma de parámetro, el orden de las interfaces de la clase proxy se convierte en significativo. Cuando se invoca este método duplicado en una instancia de proxy, el Method
objeto pasado al controlador de invocación no será necesariamente el que se pueda asignar a la clase declarante desde el tipo de referencia de la interfaz a la que se invocó el método del proxy. Esta limitación existe porque la implementación del método correspondiente en la clase de proxy generada no puede determinar a qué interfaz se invocó. Por lo tanto, cuando se invoca un método duplicado en una instancia de proxy, el Method
objeto del método en la interfaz más importante que contiene el método (ya sea directamente o heredado a través de un superinterface) en la lista de interfaces de la clase proxy se pasa al método del controlador de invocación, independientemente del tipo de referencia a través del invoke
cual se produjo la invocación del método.
Si una interfaz de proxy contiene un método con el mismo nombre y la misma firma de parámetro que los hashCode
métodos , equals
o toString
de java.lang.Object
, cuando se invoca un método de este tipo en una instancia de proxy, el Method
objeto pasado al controlador de invocación tendrá java.lang.Object
como clase declarante. Es decir, los métodos públicos y no finales de java.lang.Object
preceden lógicamente a todas las interfaces de proxy para la determinación del objeto que Method
se va a pasar al controlador de invocación.
Tenga en cuenta también que, cuando se envía un método duplicado a un controlador de invocación, el invoke
método solo puede iniciar tipos de excepción comprobados que se puedan asignar a uno de los tipos de excepción de la throws
cláusula del método en todas las interfaces proxy a las que se puede invocar. Si el invoke
método produce una excepción comprobada que no se puede asignar a ninguno de los tipos de excepción declarados por el método en una de las interfaces de proxy a las que se puede invocar, la invocación de la instancia de proxy generará una desactivación UndeclaredThrowableException
. Esta restricción significa que no todos los tipos de excepción devueltos invocando getExceptionTypes
en el Method
objeto pasado al invoke
método pueden iniciarse necesariamente correctamente por el invoke
método.
Se agregó en la versión 1.3.
Documentación de Java para java.lang.reflect.Proxy
.
Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el proyecto de código y se usan según los términos descritos en la creative Commons 2.5.
Constructores
Proxy(IInvocationHandler) |
Construye una nueva |
Proxy(IntPtr, JniHandleOwnership) |
Constructor utilizado al crear representaciones administradas de objetos JNI; llamado por el entorno de ejecución. |
Propiedades
Class |
Devuelve la clase en tiempo de ejecución de este |
H |
controlador de invocación para esta instancia de proxy. |
Handle |
Identificador de la instancia de Android subyacente. (Heredado de Object) |
JniIdentityHashCode |
|
JniPeerMembers |
|
PeerReference |
|
ThresholdClass |
Esta API admite la infraestructura mono para Android y no está pensada para usarse directamente desde el código. |
ThresholdType |
Esta API admite la infraestructura mono para Android y no está pensada para usarse directamente desde el código. |
Métodos
Clone() |
Crea y devuelve una copia de este objeto. (Heredado de Object) |
Dispose() |
|
Dispose(Boolean) |
|
Equals(Object) |
Indica si algún otro objeto es "igual a" este. (Heredado de Object) |
GetHashCode() |
Devuelve un valor de código hash del objeto. (Heredado de Object) |
GetInvocationHandler(Object) |
Devuelve el controlador de invocación de la instancia de proxy especificada. |
GetProxyClass(ClassLoader, Class[]) |
Devuelve el |
IsProxyClass(Class) |
Devuelve true si y solo si la clase especificada se generó dinámicamente para ser una clase proxy mediante el |
JavaFinalize() |
Llamado por el recolector de elementos no utilizados en un objeto cuando la recolección de elementos no utilizados determina que no hay más referencias al objeto. (Heredado de Object) |
NewProxyInstance(ClassLoader, Class[], IInvocationHandler) |
Devuelve una instancia de una clase de proxy para las interfaces especificadas que distribuye las invocaciones de método al controlador de invocación especificado. |
Notify() |
Activa un único subproceso que está esperando en el monitor de este objeto. (Heredado de Object) |
NotifyAll() |
Activa todos los subprocesos que están esperando en el monitor de este objeto. (Heredado de Object) |
SetHandle(IntPtr, JniHandleOwnership) |
Establece la propiedad Handle. (Heredado de Object) |
ToArray<T>() |
|
ToString() |
Devuelve una representación de cadena del objeto. (Heredado de Object) |
UnregisterFromRuntime() |
|
Wait() |
Hace que el subproceso actual espere hasta que se despierte, normalmente por ser em notificado/em> o <em>interrumpido</em>.<>< (Heredado de Object) |
Wait(Int64) |
Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <notificado<>/em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real. (Heredado de Object) |
Wait(Int64, Int32) |
Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <notificado<>/em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real. (Heredado de Object) |
Implementaciones de interfaz explícitas
IJavaPeerable.Disposed() |
|
IJavaPeerable.DisposeUnlessReferenced() |
|
IJavaPeerable.Finalized() |
|
IJavaPeerable.JniManagedPeerState |
|
IJavaPeerable.SetJniIdentityHashCode(Int32) |
|
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
|
IJavaPeerable.SetPeerReference(JniObjectReference) |
|
Métodos de extensión
JavaCast<TResult>(IJavaObject) |
Realiza una conversión de tipos comprobados en tiempo de ejecución de Android. |
JavaCast<TResult>(IJavaObject) |
|
GetJniTypeName(IJavaPeerable) |
|