Come altri hanno già detto correttamente, utilizzare un DynamicProxy. Ecco un esempio.
Questa classe utilizza un DynamicProxy per intercettare le invocazioni dei metodi dichiarati nell'interfaccia "HammerListener". Fa un po 'di logging e quindi delega all'implementazione "reale" di HammerListener (sì, la stessa cosa può essere fatta con AOP).
Vedere il nuovo metodoInstance per l'istanziazione proxy (si noti che è necessario passare l'interfaccia (s) che il proxy deve implementare - un proxy può implementare un'interfaccia multipla).
Tutte le chiamate di metodi sulle interfacce che il proxy implementa finiranno come chiamate al metodo "invoke", che viene dichiarato nell'interfaccia "InvocationHandler". Tutti i gestori di proxy devono implementare questa interfaccia.
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: Grazie, molto utile! – cibercitizen1
Questa è la cosa più straordinaria che ho visto da un po '. –
"Tutte le chiamate di metodi sulle interfacce implementate dal proxy" - Quindi, non utile se si desidera intercettare * qualsiasi richiamo del metodo * possibile, quindi? – allquixotic