diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/TypeUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/TypeUtil.java index 233f4ad64..ffceb4ed7 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/TypeUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/TypeUtil.java @@ -52,7 +52,11 @@ public class TypeUtil { } else if (type instanceof ParameterizedType) { return (Class) ((ParameterizedType) type).getRawType(); } else if (type instanceof TypeVariable) { - return (Class) ((TypeVariable) type).getBounds()[0]; + //return (Class) ((TypeVariable) type).getBounds()[0]; + final Type[] bounds = ((TypeVariable) type).getBounds(); + if (bounds.length == 1) { + return getClass(bounds[0]); + } } else if (type instanceof WildcardType) { final Type[] upperBounds = ((WildcardType) type).getUpperBounds(); if (upperBounds.length == 1) { diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/util/TypeUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/util/TypeUtilTest.java index aa29cfed5..a8654dcfa 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/util/TypeUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/util/TypeUtilTest.java @@ -82,6 +82,19 @@ public class TypeUtilTest { Assertions.assertEquals(Long.class, idType); } + @Test + public void getClasses() { + Method method = MethodUtil.getMethod(Parent.class, "getLevel"); + Type returnType = TypeUtil.getReturnType(method); + Class clazz = TypeUtil.getClass(returnType); + Assertions.assertEquals(Level1.class, clazz); + + method = MethodUtil.getMethod(Level1.class, "getId"); + returnType = TypeUtil.getReturnType(method); + clazz = TypeUtil.getClass(returnType); + Assertions.assertEquals(Object.class, clazz); + } + public static class Level3 extends Level2{ } @@ -95,4 +108,9 @@ public class TypeUtilTest { private T id; } + @Data + public static class Parent, B extends Long> { + private T level; + } + } diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/aop/engine/spring/SpringCglibInterceptor.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/aop/engine/spring/SpringCglibInterceptor.java index 0c42bb582..c0f5ab31c 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/aop/engine/spring/SpringCglibInterceptor.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/aop/engine/spring/SpringCglibInterceptor.java @@ -12,6 +12,7 @@ package org.dromara.hutool.extra.aop.engine.spring; +import org.dromara.hutool.core.exception.ExceptionUtil; import org.dromara.hutool.extra.aop.Aspect; import org.dromara.hutool.extra.aop.SimpleInterceptor; import org.springframework.cglib.proxy.MethodInterceptor; @@ -47,10 +48,15 @@ public class SpringCglibInterceptor extends SimpleInterceptor implements MethodI if (aspect.before(target, method, args)) { try { result = proxy.invoke(target, args); - } catch (final InvocationTargetException e) { + } catch (final Throwable e) { + Throwable throwable = e; + if(throwable instanceof InvocationTargetException){ + throwable = ((InvocationTargetException) throwable).getTargetException(); + } + // 异常回调(只捕获业务代码导致的异常,而非反射导致的异常) - if (aspect.afterException(target, method, args, e.getTargetException())) { - throw e; + if (aspect.afterException(target, method, args, throwable)) { + throw throwable; } } }