@Override
public Object intercept(Object target, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
ArrayList<Pair<ComponentMethodInterceptor, Object>> interceptors = new ArrayList<Pair<ComponentMethodInterceptor, Object>>();
for (ComponentMethodInterceptor interceptor : getInterceptors()) {
if (interceptor.needToIntercept(method)) {
Object objReturnedInInterceptStart = interceptor.interceptStart(method, target);
interceptors.add(new Pair<ComponentMethodInterceptor, Object>(interceptor, objReturnedInInterceptStart));
}
}
boolean success = false;
try {
Object obj = methodProxy.invokeSuper(target, args);
success = true;
return obj;
} finally {
for (Pair<ComponentMethodInterceptor, Object> interceptor : interceptors) {
if (success) {
interceptor.first().interceptComplete(method, target, interceptor.second());
} else {
interceptor.first().interceptException(method, target, interceptor.second());
}
}
}
}
}