正如其他人已經正確表示,使用DynamicProxy。這是一個例子。
該類使用DynamicProxy截獲在「HammerListener」接口中聲明的方法的調用。它執行一些日誌記錄,然後委託給「真正的」HammerListener實現(是的,AOP可以完成同樣的事情)。
請參閱代理實例化的newInstance方法(請注意,您需要傳入代理應實現的接口 - 代理可以實現多個接口)。
代理實現的接口上的所有方法調用最終將調用「invoke」方法,該方法在「InvocationHandler」接口中聲明。所有代理處理程序必須實現此接口。
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:謝謝,非常有幫助! – cibercitizen1 2010-03-30 12:51:41
這是我見過的最棒的東西。 – 2013-04-10 21:58:28
「代理實現的接口上的所有方法調用」 - 因此,如果要攔截*任何可能的*方法調用,那麼該方法無用嗎? – allquixotic 2017-09-24 23:19:48