This commit is contained in:
Looly 2023-10-18 08:59:23 +08:00
commit 05d13de588
5 changed files with 58 additions and 24 deletions

View File

@ -14,7 +14,12 @@
* 【cron 】 修复Cron表达式range解析错误问题issue#I82CSH@Gitee
* 【core 】 修复VersionComparator在极端数据排序时候违反了自反性问题issue#I81N3H@Gitee
* 【json 】 修复JSONStrFormatter:format函数对于转义符号处理逻辑错误问题issue#I84V6I@Gitee
<<<<<<< HEAD
* 【core 】 修复特定情况下BiMap覆盖Value后仍能通过旧Value查询到Key问题issue#I88R5M@Gitee
=======
* 【core 】 修复aop的afterException无法生效问题issue#3329@Github
* 【core 】 修复TypeUtil.getClass方法强转报错问题pr#1092@Github
>>>>>>> fd9e1efa2860ded5cf2d1be5954fd87a2a5830fe
-------------------------------------------------------------------------------------------------------------
# 5.8.22(2023-09-13)

View File

@ -43,10 +43,14 @@ public class CglibInterceptor implements MethodInterceptor, Serializable {
try {
// result = proxy.invokeSuper(obj, args);
result = proxy.invoke(target, args);
} catch (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;
}
}
}

View File

@ -48,9 +48,14 @@ public class SpringCglibInterceptor implements MethodInterceptor, Serializable {
try {
// result = proxy.invokeSuper(obj, args);
result = proxy.invoke(target, args);
} catch (InvocationTargetException e) {
} catch (Throwable e) {
Throwable throwable = e;
if(throwable instanceof InvocationTargetException){
throwable = ((InvocationTargetException) throwable).getTargetException();
}
// 异常回调只捕获业务代码导致的异常而非反射导致的异常
if (aspect.afterException(target, method, args, e.getTargetException())) {
if (aspect.afterException(target, method, args, throwable)) {
throw e;
}
}

View File

@ -40,7 +40,10 @@ public class TypeUtil {
} else if (type instanceof ParameterizedType) {
return (Class<?>) ((ParameterizedType) type).getRawType();
} else if (type instanceof TypeVariable) {
return (Class<?>) ((TypeVariable<?>) type).getBounds()[0];
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) {

View File

@ -1,48 +1,61 @@
package cn.hutool.core.util;
import lombok.Data;
import org.junit.Assert;
import org.junit.Test;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import org.junit.Assert;
import org.junit.Test;
public class TypeUtilTest {
@Test
public void getEleTypeTest() {
Method method = ReflectUtil.getMethod(TestClass.class, "getList");
Type type = TypeUtil.getReturnType(method);
Assert.assertEquals("java.util.List<java.lang.String>", type.toString());
Type type2 = TypeUtil.getTypeArgument(type);
Assert.assertEquals(String.class, type2);
}
@Test
public void getParamTypeTest() {
Method method = ReflectUtil.getMethod(TestClass.class, "intTest", Integer.class);
Type type = TypeUtil.getParamType(method, 0);
Assert.assertEquals(Integer.class, type);
Type returnType = TypeUtil.getReturnType(method);
Assert.assertEquals(Integer.class, returnType);
}
@Test
public void getClasses() {
Method method = ReflectUtil.getMethod(Parent.class, "getLevel");
Type returnType = TypeUtil.getReturnType(method);
Class clazz = TypeUtil.getClass(returnType);
Assert.assertEquals(Level1.class, clazz);
method = ReflectUtil.getMethod(Level1.class, "getId");
returnType = TypeUtil.getReturnType(method);
clazz = TypeUtil.getClass(returnType);
Assert.assertEquals(Object.class, clazz);
}
public static class TestClass {
public List<String> getList(){
public List<String> getList() {
return new ArrayList<>();
}
public Integer intTest(Integer integer) {
return 1;
}
}
@Test
public void getTypeArgumentTest(){
public void getTypeArgumentTest() {
// 测试不继承父类而是实现泛型接口时是否可以获取成功
final Type typeArgument = TypeUtil.getTypeArgument(IPService.class);
Assert.assertEquals(String.class, typeArgument);
@ -59,25 +72,29 @@ public class TypeUtilTest {
}
@Test
public void getActualTypesTest(){
public void getActualTypesTest() {
// 测试多层级泛型参数是否能获取成功
Type idType = TypeUtil.getActualType(Level3.class,
ReflectUtil.getField(Level3.class, "id"));
Type idType = TypeUtil.getActualType(Level3.class, ReflectUtil.getField(Level3.class, "id"));
Assert.assertEquals(Long.class, idType);
}
public static class Level3 extends Level2<Level3>{
public static class Level3 extends Level2<Level3> {
}
public static class Level2<E> extends Level1<Long>{
public static class Level2<E> extends Level1<Long> {
}
@Data
public static class Level1<T>{
public static class Level1<T> {
private T id;
}
@Data
public static class Parent<T extends Level1<B>, B extends Long> {
private T level;
}
}