¿Cómo hacer que JVM represente el único método de interfaz de proxy?
public interface Acción {
void hacerAlgo();
void noProxear();
}
Por ejemplo, con esta interfaz, solo quiero que la JVM cree un proxy para el método hacerAlgo.
class ProxyDinámico implements InvocationHandler{
private Acción trabajo;
public ProxyDinámico(Acción acción){
this.trabajo = acción;
}
@Override
public Object invoke(Object proxy, Method método, Object[] args) throws Throwable {
System.out.println(método.getName()+" comienza");
var tmp = método.invoke(trabajo,args);
System.out.println(método.getName()+" termina");
return tmp;
}
Acción acción = (Acción) Proxy.newProxyInstance(handler.getClass().getClassLoader(),trabajo.getClass().getInterfaces(),handler);
El trabajo es una instancia de la clase de implementación de la interfaz Acción. Si utilizo Proxy.newProxyInstance, parece que hace que todos los métodos de la interfaz sean manejados por el handler.
davy.ai
Este fragmento de código demuestra cómo utilizar el proxy dinámico de JDK para interceptar llamadas a métodos en una interfaz.
La interfaz llamada
Action
contiene dos métodos –doSomething()
ydontProxy()
. El objetivo es hacer que el JVM sólo provea el métododoSomething()
.Para lograrlo, se crea una clase llamada
DynamicProxy
que implementa la interfazInvocationHandler
proporcionada por JDK. La claseDynamicProxy
tiene un constructor que toma una instancia de una clase que implementa la interfazAction
.El método
invoke()
de la claseDynamicProxy
es llamado por el JVM cuando se invoca un método de la interfazAction
. Dentro del métodoinvoke()
, el nombre del método invocado se imprime en la consola seguido de ‘start’, después el método real es invocado en la instancia subyacente deAction
, y finalmente el nombre del método se imprime nuevamente con ‘end’ anexado.Finalmente, una nueva instancia de la interfaz
Action
es creada utilizando el métodoProxy.newProxyInstance()
. Este método toma tres argumentos: el cargador de clases de la instancia deDynamicProxy
, la lista de interfaces que la instancia proxy debe implementar, y el objetoDynamicProxy
en sí mismo.De esta manera, cuando uno de los métodos
doSomething()
es llamado en la nueva instancia deAction
, el objetoDynamicProxy
intercepta la llamada y registra su inicio y finalización. Sin embargo, cuando el métododontProxy()
es llamado, éste es ejecutado en la instancia subyacente deAction
sin ser interceptado por el objetoDynamicProxy
.