Como ya se ha dicho correctamente, use un DynamicProxy. Aquí hay un ejemplo.
Esta clase usa un DynamicProxy para interceptar invocaciones de métodos declarados en la interfaz "HammerListener". Hace un poco de registro y luego delega en la implementación "real" de HammerListener (sí, lo mismo se puede hacer con AOP).
Vea el nuevo método de instancia para la creación de instancias de proxy (tenga en cuenta que debe pasar las interfaces que el proxy debe implementar: un proxy puede implementar una interfaz múltiple).
Todas las invocaciones de métodos en las interfaces que implementa el proxy terminarán como llamadas al método "invocar", que se declara en la interfaz "InvocationHandler". Todos los controladores proxy deben implementar esta interfaz.
import java.lang.reflect.*;
/**
* Decorates a HammerListener instance, adding BEFORE/AFTER
* log messages around all methods exposed in the HammerListener interface.
*/
public class HammerListenerDecorator implements InvocationHandler {
private final HammerListener delegate;
static HammerListener newInstance(HammerListener delegate) {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
return (HammerListener)Proxy.newProxyInstance(cl, new Class[]{HammerListener.class},
new HammerListenerDecorator(delegate));
}
private HammerListenerDecorator(HammerListener delegate) {
this.delegate = delegate;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
logger.info("BEFORE " + method.getName() + " {{{" + argsToString(args) + "}}}");
Object rtn = method.invoke(delegate, args);
logger.info("AFTER " + method.getName());
return rtn;
}
private String argsToString(Object[] args) {
StringBuilder sb = new StringBuilder();
for (Object o : args) {
sb.append(String.valueOf(o)).append(" ");
}
return sb.toString();
}
}
@ killdash10: ¡Gracias, muy útiles! – cibercitizen1
Esto es lo más impresionante que he visto en mucho tiempo. –
"Todas las invocaciones de métodos en las interfaces que implementa el proxy" - Entonces, ¿no es útil si quiere interceptar * cualquier posible invocación de método? – allquixotic