diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dbe0b555..e8c3b0b9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ * 【core 】 DateUtil.toIntSecond标记为弃用(issue#I4JHPR@Gitee) * 【db 】 Db.executeBatch标记一个重载为弃用(issue#I4JIPH@Gitee) * 【core 】 增加CharSequenceUtil.subPreGbk重载(issue#I4JO2E@Gitee) +* 【core 】 ReflectUtil.getMethod排除桥接方法(pr#1965@Github) * ### 🐞Bug修复 * 【core 】 修复FileResource构造fileName参数无效问题(issue#1942@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java index 15a07faff..595a61d69 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java @@ -2551,7 +2551,12 @@ public class CharSequenceUtil { } /** - * 比较两个字符串是否相等。 + * 比较两个字符串是否相等,规则如下 + * * * @param str1 要比较的字符串1 * @param str2 要比较的字符串2 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 affdcac6e..b0f9b1d7f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java @@ -84,7 +84,7 @@ public class ReflectUtil { @SuppressWarnings("unchecked") public static Constructor[] getConstructors(Class beanClass) throws SecurityException { Assert.notNull(beanClass); - return (Constructor[]) CONSTRUCTORS_CACHE.get(beanClass, ()->getConstructorsDirectly(beanClass)); + return (Constructor[]) CONSTRUCTORS_CACHE.get(beanClass, () -> getConstructorsDirectly(beanClass)); } /** @@ -173,7 +173,7 @@ public class ReflectUtil { */ public static Field[] getFields(Class beanClass) throws SecurityException { Assert.notNull(beanClass); - return FIELDS_CACHE.get(beanClass, ()->getFieldsDirectly(beanClass, true)); + return FIELDS_CACHE.get(beanClass, () -> getFieldsDirectly(beanClass, true)); } @@ -498,11 +498,9 @@ public class ReflectUtil { } /** - * 查找指定方法 如果找不到对应的方法则返回{@code null} - * - *

- * 此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回{@code null}。 - *

+ * 查找指定方法 如果找不到对应的方法则返回{@code null}
+ * 此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回{@code null}。
+ * 如果查找的方法有多个同参数类型重载,查找第一个找到的方法 * * @param clazz 类,如果为{@code null}返回{@code null} * @param ignoreCase 是否忽略大小写 @@ -520,10 +518,11 @@ public class ReflectUtil { final Method[] methods = getMethods(clazz); if (ArrayUtil.isNotEmpty(methods)) { for (Method method : methods) { - if (StrUtil.equals(methodName, method.getName(), ignoreCase)) { - if (ClassUtil.isAllAssignableFrom(method.getParameterTypes(), paramTypes)) { - return method; - } + if (StrUtil.equals(methodName, method.getName(), ignoreCase) + && ClassUtil.isAllAssignableFrom(method.getParameterTypes(), paramTypes) + //排除桥接方法,pr#1965@Github + && false == method.isBridge()) { + return method; } } } @@ -586,7 +585,9 @@ public class ReflectUtil { final Method[] methods = getMethods(clazz); if (ArrayUtil.isNotEmpty(methods)) { for (Method method : methods) { - if (StrUtil.equals(methodName, method.getName(), ignoreCase)) { + if (StrUtil.equals(methodName, method.getName(), ignoreCase) + // 排除桥接方法 + && false == method.isBridge()) { return method; } } @@ -635,7 +636,7 @@ public class ReflectUtil { */ public static Method[] getMethods(Class beanClass) throws SecurityException { Assert.notNull(beanClass); - return METHODS_CACHE.get(beanClass, ()-> getMethodsDirectly(beanClass, true)); + return METHODS_CACHE.get(beanClass, () -> getMethodsDirectly(beanClass, true)); } /**