diff --git a/hutool-core/src/main/java/cn/hutool/core/reflect/MethodUtil.java b/hutool-core/src/main/java/cn/hutool/core/reflect/MethodUtil.java index f7368527f..14c960ecd 100644 --- a/hutool-core/src/main/java/cn/hutool/core/reflect/MethodUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/reflect/MethodUtil.java @@ -198,18 +198,20 @@ public class MethodUtil { return null; } + Method res = null; final Method[] methods = getMethods(clazz); if (ArrayUtil.isNotEmpty(methods)) { for (final 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; } /** @@ -265,17 +267,18 @@ public class MethodUtil { return null; } + Method res = null; final Method[] methods = getMethods(clazz); if (ArrayUtil.isNotEmpty(methods)) { for (final 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/reflect/MethodUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/reflect/MethodUtilTest.java index 5919e66c3..1198aa049 100644 --- a/hutool-core/src/test/java/cn/hutool/core/reflect/MethodUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/reflect/MethodUtilTest.java @@ -115,6 +115,7 @@ public class MethodUtilTest { Console.log(timer.getLastTaskTimeMillis()); } + @SuppressWarnings("UnusedReturnValue") public static Method getMethodWithReturnTypeCheck(final Class clazz, final boolean ignoreCase, final String methodName, final Class... paramTypes) throws SecurityException { if (null == clazz || StrUtil.isBlank(methodName)) { return null; @@ -193,6 +194,26 @@ public class MethodUtilTest { Assert.assertNotNull(publicSubMethod); final Method privateSubMethod = MethodUtil.getMethod(ReflectUtilTest.TestSubClass.class, "privateSubMethod"); Assert.assertNotNull(privateSubMethod); + } + @Test + public void issue2625Test(){ + // 内部类继承的情况下父类方法会被定义为桥接方法,因此按照pr#1965@Github判断返回值的继承关系来代替判断桥接。 + final Method getThis = MethodUtil.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; + } + } } } diff --git a/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java index 95cfe2ebc..d95d773e6 100644 --- a/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/StrUtilTest.java @@ -695,4 +695,10 @@ public class StrUtilTest { Assert.assertTrue(CharSequenceUtil.isAllBlank("\u2000")); Assert.assertTrue(CharSequenceUtil.isAllBlank("\u2001")); } + + @Test + public void issue2628Test(){ + final String s = StrUtil.indexedFormat("a{0,number,#}", 1234567); + Assert.assertEquals("a1234567", s); + } }