Jak już mówili inni, należy użyć DynamicProxy. Oto przykład.
Ta klasa używa DynamicProxy do przechwytywania wywołań metod zadeklarowanych w interfejsie "HammerListener". Wykonuje pewne logowanie, a następnie deleguje do "prawdziwej" implementacji HammerListener (tak, to samo można zrobić z AOP).
Zobacz metodę newInstance dla instancji proxy (pamiętaj, że musisz przekazać interfejs (y), który serwer proxy powinien zaimplementować - proxy może zaimplementować wiele interfejsów).
Wszystkie wywołania metod na interfejsach, które implementuje proxy, zostaną zakończone jako wywołania metody "invoke", która jest zadeklarowana w interfejsie "InvocationHandler". Wszystkie procedury obsługi proxy muszą implementować ten interfejs.
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: Dzięki, bardzo pomocne! – cibercitizen1
To jest najbardziej niesamowita rzecz, jaką widziałem od jakiegoś czasu. –
"Wszystkie wywołania metod na interfejsach implementowanych przez serwer proxy" - A więc nie jest użyteczne, jeśli chcesz przechwycić * możliwe wywołanie metody *, a następnie? – allquixotic