From 8d348b539d3738be769562fe33116b2acb7a890e Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 23 Sep 2022 11:51:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DReflectUtil=20=E5=8F=8D?= =?UTF-8?q?=E5=B0=84=E6=96=B9=E6=B3=95=E4=B8=AD=E6=A1=A5=E6=8E=A5=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 ++- .../java/cn/hutool/core/util/ReflectUtil.java | 20 +++++++++++------- .../cn/hutool/core/util/ReflectUtilTest.java | 21 +++++++++++++++++++ 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 957959c0a..568914bf1 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.8.M1 (2022-09-22) +# 5.8.8.M1 (2022-09-23) ### 🐣新特性 * 【core 】 StreamUtil.of方法新增对 Iterator 支持;StreamUtil.of(Iterable) 方法优化(pr#807@Gitee) @@ -17,6 +17,7 @@ * 【core 】 修复murmur3_32实现错误(pr#2616@Github) * 【core 】 修复PunyCode处理域名的问题(pr#2620@Github) * 【core 】 修复ObjectUtil.defaultIfNull去掉误加的deprecated(issue#I5SIZT@Gitee) +* 【core 】 修复ReflectUtil 反射方法中桥接判断问题(issue#2625@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java index 95800d2b1..a94a5007f 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java @@ -539,18 +539,20 @@ public class ReflectUtil { return null; } + Method res = null; final Method[] methods = getMethods(clazz); if (ArrayUtil.isNotEmpty(methods)) { for (Method method : methods) { if (StrUtil.equals(methodName, method.getName(), ignoreCase) && ClassUtil.isAllAssignableFrom(method.getParameterTypes(), paramTypes) - //排除桥接方法,pr#1965@Github - && false == method.isBridge()) { - return method; + //排除协变桥接方法,pr#1965@Github + && (res == null + || res.getReturnType().isAssignableFrom(method.getReturnType()))) { + res = method; } } } - return null; + return res; } /** @@ -606,17 +608,19 @@ public class ReflectUtil { return null; } + Method res = null; final Method[] methods = getMethods(clazz); if (ArrayUtil.isNotEmpty(methods)) { for (Method method : methods) { if (StrUtil.equals(methodName, method.getName(), ignoreCase) - // 排除桥接方法 - && false == method.isBridge()) { - return method; + //排除协变桥接方法,pr#1965@Github + && (res == null + || res.getReturnType().isAssignableFrom(method.getReturnType()))) { + res = method; } } } - return null; + return res; } /** diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ReflectUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ReflectUtilTest.java index 3b82a70a6..6a5a88adc 100755 --- a/hutool-core/src/test/java/cn/hutool/core/util/ReflectUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ReflectUtilTest.java @@ -292,4 +292,25 @@ public class ReflectUtilTest { Assert.assertEquals(dialects, ReflectUtil.getFieldValue(JdbcDialects.class, fieldName)); } + + @Test + public void issue2625Test(){ + // 内部类继承的情况下父类方法会被定义为桥接方法,因此按照pr#1965@Github判断返回值的继承关系来代替判断桥接。 + final Method getThis = ReflectUtil.getMethod(A.C.class, "getThis"); + Assert.assertTrue(getThis.isBridge()); + } + + @SuppressWarnings("InnerClassMayBeStatic") + public class A{ + + public class C extends B{ + + } + + protected class B{ + public B getThis(){ + return this; + } + } + } }