"Dynamic proxy" es un patron de diseño.
Un proxy es un intermediario entre un objeto y otro, o bien una persona autorizada para actuar como si fuera otra.
El proxy debe tener una referencia al objeto en cuestion
Types of Proxies
Remote Proxy - Provee una referencia a objetos remotos (RMI)
Virtual Proxy - Crea un objeto solo hasta que es realmente requerido. (Tipo Populate on demand)
Copy-On-Write Proxy - Es un tipo de proxy virtual que utiliza una copia del objeto para protegerlo de escritura
Protection (Access) Proxy - Es un tipo de proxy en el que se deben implementar mecanismos para para validar acceso. Por ejemplo Si un usuario tiene permisos solo de lectura no podra hacer llamadas a metodos de escritura.
Cache Proxy - Mantiene resultados almacenados en una memoria para permitir el acceso a mayor cantidad de usuarios
Firewall Proxy - Para proteger acceso a clientes no deseados
Synchronization Proxy - Provee acceso a multiples clientes
Smart Reference Proxy - Permite dar una mayor funcionalidad a los objetos, como mantener un conteo de las llamadas a un metodo.
A continuacion veremos un poco de codigo de java para ver como implementar un proxy dinamico.
Este ejemplo es muy sencillo y Si tienen dudas seria bueno comentarlas.
____________________________________________________________________________________________
Supongamos que tenemos una Interfaz que defina algunas operaciones
//Nombre de archivo InterfazEjemplo.java
public interface InterfazEjemplo {
String metodo1();
}
____________________________________________________________________________________________
Y una clase que implementa esa interfaz
//Nombre Archivo ClaseEjemplo.java
//Implementacion de la Interfaz
import java.lang.reflect.Proxy;
public class ClaseEjemplo implements InterfazEjemplo{
public String metodo1() {
return "Hello World";
}
}
____________________________________________________________________________________________
Hay caso en los que es necesario hacer algo antes de llamara un metodo
por lo que necesitamos usar un proxy para llamar al metodo
//Nombre de archivo Main.java
//Aqui vemos el ejemplo de como Instancias un proxy a un objeto
public class Main {
public static void main(String []args) {
ClassLoader loader = InterfazEjemplo.class.getClassLoader();
InterfazEjemplo x = (InterfazEjemplo) Proxy.newProxyInstance(loader, new Class[]{InterfazEjemplo.class}, new MiInvocationHandler(new ClaseEjemplo()));
x.metodo1();
}
}
____________________________________________________________________________________________
Un InvocationHandler no permite crear un proxy para poder llamar a metodos de una clase de manera dinamica y realizar operaciones antes y despues de la ejecucion del metodo
A continuacion podemos ver como se implementa el InvocationHandler o como usar Relfection para llamar a los metodos y realizar operaciones antes de ejecutarlos
//Nombre de Archivo MiInvocationHandler.java
//Esta clase permite Escuchar las llamadas a metodos y podemos hacer cosas antes de llamarlos o despues de o manupular parametros o resultados
import java.lang.reflect.*;
public class MiInvocationHandler implements InvocationHandler{
InterfazEjemplo obj;
private MiInvocationHandler() {
super();
}
public MiInvocationHandler(InterfazEjemplo obj) {
this();
this.obj = obj;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object res = null;
System.out.println("Llamando al metodo " + method.getName());
System.out.println("Antes de Ejecutar el metodo");
res = method.invoke(obj, args);
System.out.println("res = " + res);
System.out.println("Despues de Ejecutar el metodo");
return res;
}
}
Espero que esta informacion sea util, proximamente voy a agregar mas informacion acerca de esto para cubrir las dudas
No hay comentarios:
Publicar un comentario