Proxies en Java

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