Traducido/Interpretado/revisado de ![]()
El patrón Proxy es un patrón estructural (de los Patrones GoF de toda la vida :)) con este objetivo:
![]()
En la actualidad el lenguaje Java ofrece un soporte muy avanzado de este patrón y deja muy poco a la imaginación, aunque no lo veamos Hibernate, Spring, LambdaJ lo usan…
Soporte de Java para Proxy:
Los Proxies en Java deben ser clases públicas, finales y que hereden de java.lang.reflect.Proxy y deben implementar este método:
![]()
Donde:
· proxy: es la instancia del proxy en el que fue invocado el método
· method: la instancia del método invocada en el proxy
· args: array de objetos conteniendo los valores de los argumentos pasados al proxy (null si no tiene argumentos y wrappers para objetos primitivos: Integer,…).
Veamos un ejemplo, que así dicho suena raro, raro 🙂
Para crear un Proxy (NoOpAddInvocationHandler) de la clase List haría algo como esto:
Por ejemplo si lo que quiero es hacer que el método add de la clase List no haga nada, mi Proxy se parecerá a esto:
Potente no?…sí, pero engorroso también 🙂 Además hay un problema…los Proxies Java sólo funcionan para clases que implementen un interfaz ya que son implementaciones en ejecución de interfaces….la solución: hay varias:
Proxies CGLib
CGLib es un framework basado en ASM capaz de manipular el bytecode. Permite crear Proxies sin la limitación de implementar un interfaz.
Existen parecidos entre los Proxies Java y los Proxies CGLIB:
Proxy à net.sf.cglib.proxy.Enhancer
InvocationHandler à net.sf.cglib.proxy.Callback
Con este ejemplo creo un Proxy global:

Donde mi Interceptor sobreescribe el hashCode y devuelve un 0:
Afortunadamente Spring vela por nosotros y existe una forma más sencilla de crear Proxies/Interceptores. En la página de Spring nos cuentan cómo usar Spring AOP y AspectJ.





Deja un comentario