diff --git a/hutool-aop/src/main/java/cn/hutool/aop/aspects/Aspect.java b/hutool-aop/src/main/java/cn/hutool/aop/aspects/Aspect.java index a01009e32..5ab798b5c 100644 --- a/hutool-aop/src/main/java/cn/hutool/aop/aspects/Aspect.java +++ b/hutool-aop/src/main/java/cn/hutool/aop/aspects/Aspect.java @@ -23,7 +23,11 @@ public interface Aspect{ /** * 目标方法执行后的操作 - * + * 如果 target.method 抛出异常且 + * @see Aspect#afterException 返回true,则不会执行此操作 + * 如果 + * @see Aspect#afterException 返回false,则无论target.method是否抛出异常,均会执行此操作 + * * @param target 目标对象 * @param method 目标方法 * @param args 参数 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/aspects/SimpleAspect.java b/hutool-aop/src/main/java/cn/hutool/aop/aspects/SimpleAspect.java index 316723c20..c118a7056 100644 --- a/hutool-aop/src/main/java/cn/hutool/aop/aspects/SimpleAspect.java +++ b/hutool-aop/src/main/java/cn/hutool/aop/aspects/SimpleAspect.java @@ -14,18 +14,30 @@ import java.lang.reflect.Method; public abstract class SimpleAspect implements Aspect, Serializable{ private static final long serialVersionUID = 1L; + /** + * @see Aspect#before(Object, Method, Object[]) + * @return 是否继续执行接下来的操作 默认值true + */ @Override public boolean before(Object target, Method method, Object[] args) { //继承此类后实现此方法 return true; } + /** + * @see Aspect#after(Object, Method, Object[], Object) + * @return 是否允许返回值(接下来的操作) 默认值true + */ @Override public boolean after(Object target, Method method, Object[] args, Object returnVal) { //继承此类后实现此方法 return true; } + /** + * @see Aspect#afterException(Object, Method, Object[], Throwable) + * @return 是否允许抛出异常 默认值true + */ @Override public boolean afterException(Object target, Method method, Object[] args, Throwable e) { //继承此类后实现此方法 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/interceptor/CglibInterceptor.java b/hutool-aop/src/main/java/cn/hutool/aop/interceptor/CglibInterceptor.java index 2c9e253ee..8c53df4cd 100644 --- a/hutool-aop/src/main/java/cn/hutool/aop/interceptor/CglibInterceptor.java +++ b/hutool-aop/src/main/java/cn/hutool/aop/interceptor/CglibInterceptor.java @@ -46,11 +46,14 @@ public class CglibInterceptor implements MethodInterceptor, Serializable { result = proxy.invokeSuper(obj, args); } catch (UtilException e) { final Throwable cause = e.getCause(); - if (e.getCause() instanceof InvocationTargetException) { - aspect.afterException(target, method, args, ((InvocationTargetException) cause).getTargetException()); - } else { - throw e;// 其它异常属于代理的异常,直接抛出 + if (!(e.getCause() instanceof InvocationTargetException)) { + // 其它异常属于代理的异常,直接抛出 + throw e; } + if(aspect.afterException(target, method, args, ((InvocationTargetException) cause).getTargetException())){ + throw e; + } + } } if (aspect.after(target, method, args, result)) { diff --git a/hutool-aop/src/main/java/cn/hutool/aop/interceptor/JdkInterceptor.java b/hutool-aop/src/main/java/cn/hutool/aop/interceptor/JdkInterceptor.java index 52b433016..73b89ba83 100644 --- a/hutool-aop/src/main/java/cn/hutool/aop/interceptor/JdkInterceptor.java +++ b/hutool-aop/src/main/java/cn/hutool/aop/interceptor/JdkInterceptor.java @@ -47,10 +47,12 @@ public class JdkInterceptor implements InvocationHandler, Serializable{ result = ReflectUtil.invoke(target, method, args); } catch (UtilException e) { final Throwable cause = e.getCause(); - if (e.getCause() instanceof InvocationTargetException) { - aspect.afterException(target, method, args, ((InvocationTargetException) cause).getTargetException()); - } else { - throw e;// 其它异常属于代理的异常,直接抛出 + if (!(e.getCause() instanceof InvocationTargetException)) { + // 其它异常属于代理的异常,直接抛出 + throw e; + } + if(aspect.afterException(target, method, args, ((InvocationTargetException) cause).getTargetException())){ + throw e; } } }