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ámico creadas por esos 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
- 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ámico 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 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 está especificado. Sin embargo, el espacio de nombres de clase que comienzan por 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, también no 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 tampoco 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, invocar 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 invocará getMethod 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.newProxyInstancey false en caso contrario.
<li>El java.security.ProtectionDomain valor de una clase de proxy es el mismo que el 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 Fooproxy , 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 pasada 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 hashCodemétodos , equalso toString declarados en en java.lang.Object una instancia de proxy se codificará y se 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 invoke a 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 las 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 tiene asignada 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 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 (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 invoke tipo de referencia a través del 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 hashCodemétodos , equalso toString de java.lang.Object, cuando se invoca dicho método en una instancia de proxy, el Method objeto pasado al controlador de invocación tendrá java.lang.Object como su 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 producir tipos de excepciones 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 de 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 se pueden producir necesariamente correctamente mediante el invoke método .
Agregado en la versión 1.3.
Java documentación para java.lang.reflect.Proxy.
Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el Android y se usan según los términos descritos en creative Creative Commons 2.5 Attribution License.
Constructores
| Nombre | Description |
|---|---|
| Proxy(IInvocationHandler) |
Construye una nueva |
| Proxy(IntPtr, JniHandleOwnership) |
Constructor utilizado al crear representaciones administradas de objetos JNI; llamado por el tiempo de ejecución. |
Propiedades
| Nombre | Description |
|---|---|
| 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 |
Obtiene el código hash de identidad asignado a este Java del mismo nivel por el tiempo de ejecución de interoperabilidad. (Heredado de Object) |
| JniManagedPeerState |
|
| JniPeerMembers |
|
| PeerReference |
Obtiene la referencia de objeto JNI para este Java del mismo nivel. (Heredado de Object) |
| 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
| Nombre | Description |
|---|---|
| Clone() |
Crea y devuelve una copia de este objeto. (Heredado de Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
|
| Dispose() |
Libera los recursos mantenidos por este Java del mismo nivel. (Heredado de Object) |
| Dispose(Boolean) |
Libera los recursos mantenidos por este Java del mismo nivel. (Heredado de Object) |
| DisposeUnlessReferenced() |
|
| Equals(Object) |
|
| Equals(Object) |
Indica si algún otro objeto es "igual a" este. (Heredado de Object) |
| GetHashCode() |
Devuelve un valor de código hash para el 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() |
Obsoletos.
Lo llama 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) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
|
| ToArray<T>() |
Crea una matriz administrada a partir de este contenedor de matriz Java. (Heredado de Object) |
| ToString() |
Devuelve una representación de cadena del objeto . (Heredado de Object) |
| UnregisterFromRuntime() |
Anula el registro de este Java del mismo nivel del tiempo de ejecución de interoperabilidad. (Heredado de Object) |
| 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, Int32) |
Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <em>notificado</em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real. (Heredado de Object) |
| Wait(Int64) |
Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <em>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
| Nombre | Description |
|---|---|
| IJavaPeerable.Disposed() |
|
| IJavaPeerable.Finalized() |
|
| IJavaPeerable.JniObjectReferenceControlBlock |
|
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
|
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
|
| IJavaPeerable.SetPeerReference(JniObjectReference) |
|
| IJavaPeerable.UnregisterFromRuntime() |
|
Métodos de extensión
| Nombre | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
Obtiene el nombre JNI del tipo de la instancia |
| JavaAs<TResult>(IJavaPeerable) |
Intente coerción |
| JavaCast<TResult>(IJavaObject) |
Realiza una conversión de tipos comprobados en tiempo de ejecución de Android. |
| JavaCast<TResult>(IJavaObject) |
|
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Intente coerción |