From 22a51ba86de31ad0f72befa70bc479ed83abaeac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E7=BE=BD=E9=93=96?= Date: Wed, 25 Sep 2019 11:36:03 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=88=87=E9=9D=A2after=E5=88=87?= =?UTF-8?q?=E7=82=B9=EF=BC=8C=E5=B0=86=E7=9B=AE=E6=A0=87=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E8=BF=94=E5=9B=9E=E5=80=BC=EF=BC=8C=E5=BC=80?= =?UTF-8?q?=E6=94=BE=E7=BB=99=E5=88=87=E7=82=B9=202=E3=80=81SimpleAspect?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E7=9B=B4=E6=8E=A5=E4=BD=BF=E7=94=A8=E7=9A=84?= =?UTF-8?q?=E6=84=8F=E4=B9=89=EF=BC=8C=E5=BA=94=E4=BF=AE=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E6=8A=BD=E8=B1=A1=E7=B1=BB=203=E3=80=81=E4=BF=AE=E6=94=B9Aspec?= =?UTF-8?q?t#afterException=20=E6=B2=A1=E6=9C=89=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=80=BC=E8=BF=9B=E8=A1=8C=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E6=8A=9B=E5=87=BA=E7=9A=84=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E3=80=82=204=E3=80=81=E4=BF=AE=E6=94=B9CglibInterceptor#interc?= =?UTF-8?q?ept=20=E5=92=8C=20JdkInterceptor#intercept=20=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E4=B8=AD=20if=20else=20=E4=B8=BA=20if=20=EF=BC=8C=E5=87=8F?= =?UTF-8?q?=E5=B0=91else=E5=88=A4=E6=96=AD,=E5=B9=B6=E6=94=AF=E6=8C=81=20?= =?UTF-8?q?=E7=AC=AC3=E7=82=B9=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/aop/aspects/Aspect.java | 6 +++++- .../java/cn/hutool/aop/aspects/SimpleAspect.java | 12 ++++++++++++ .../cn/hutool/aop/interceptor/CglibInterceptor.java | 11 +++++++---- .../cn/hutool/aop/interceptor/JdkInterceptor.java | 10 ++++++---- 4 files changed, 30 insertions(+), 9 deletions(-) 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; } } }