Red de conocimiento informático - Aprendizaje de programación - La diferencia entre el proxy estático de Java y el proxy dinámico

La diferencia entre el proxy estático de Java y el proxy dinámico

Comparación entre el proxy estático y el proxy dinámico de JAVA

1. Clase de proxy estático:

Creado por programadores o generado automáticamente por herramientas específicas, luego se obtiene el código fuente. su compilación. Antes de ejecutar el programa, el archivo .class de la clase proxy ya existe. Clase de proxy dinámico: creada dinámicamente utilizando el mecanismo de reflexión cuando el programa se está ejecutando.

Se puede ver que la clase proxy puede preprocesar mensajes para la clase delegada, reenviar los mensajes a la clase delegada y procesar los mensajes posteriormente.

Rutina 1 HelloService.java

paquete proxy;

importar java.util.Date

interfaz pública HelloService{

public String echo(String msg);

public Date getTime();

}

2. p> A diferencia de la clase de proxy estática, la clase de proxy dinámica se genera dinámicamente mediante el mecanismo de reflexión de Java cuando el programa se está ejecutando, lo que elimina la necesidad de que los programadores escriban manualmente su código fuente. Las clases de proxy dinámico no solo simplifican el trabajo de programación, sino que también mejoran la escalabilidad de los sistemas de software, porque el mecanismo de reflexión de Java puede generar cualquier tipo de clase de proxy dinámico. La clase Proxy y la interfaz InvocationHandler en el paquete java.lang.reflect brindan la capacidad de generar clases de proxy dinámicas.

La clase Proxy proporciona métodos estáticos para crear clases de proxy dinámicas y sus instancias.

(1) El método estático getProxyClass() es responsable de crear una clase de proxy dinámica. Su definición completa es la siguiente:

public static Classlt;?gt; , Classlt;?gt ; [] interfaces) lanza IllegalArgumentException

El cargador de parámetros especifica el cargador de clases de la clase de proxy dinámico y las interfaces de parámetros especifican todas las interfaces que la clase de proxy dinámico necesita implementar.

(2) El método estático newProxyInstance() es responsable de crear instancias de clases de proxy dinámicas. Su definición completa es la siguiente:

Objeto estático público newProxyInstance(ClassLoader loader, Classlt; ?gt;[ ] interfaces, controlador InvocationHandler) lanza

IllegalArgumentException

El cargador de parámetros especifica el cargador de clases de la clase de proxy dinámico, el parámetro interfaces especifica todas las interfaces que el proxy dinámico La clase necesita implementarse y el controlador de parámetros especifica la clase de proxy dinámico. El objeto InvocationHandler asociado con la clase de proxy.

Los dos métodos siguientes crean instancias de clases de proxy dinámicas que implementan la interfaz Foo:

/**** Método 1****/

/ /Crear objeto InvocationHandler

Manejador InvocationHandler = new MyInvocationHandler(...);

//Crear clase de proxy dinámica

Clase proxyClass = Proxy.getProxyClass( Foo .class.getClassLoader(), new Class[] { Foo.class });

//Crea una instancia de la clase de proxy dinámico

Foo foo = (Foo) proxyClass. getConstructor (nueva clase[] { InvocationHandler.class }).

newInstance(new Object[] { handler });

/**** Método 2****/

//Crear un objeto InvocationHandler

InvocationHandler handler = new MyInvocationHandler(...);

//Crear directamente una instancia de la clase de proxy dinámico

Foo foo = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class[] { Foo.class }, handler);

Proxy dinámico creado por el estático método de la clase Proxy La clase tiene las siguientes características:

La clase de proxy dinámico es pública, final y de tipo no abstracto;

La clase de proxy dinámico hereda el archivo java.lang. reflect.Proxy class;

El nombre de la clase de proxy dinámico comienza con "$Proxy";

La clase de proxy dinámico implementa todas las interfaces especificadas por las interfaces de parámetros en getProxyClass() y métodos newProxyInstance();