From c075b3085808bf84cfbba04835eaa8e70b3df562 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 7 Jan 2022 21:14:54 +0800 Subject: [PATCH 01/19] prepare 5.7.20 --- CHANGELOG.md | 6 ++++++ README-EN.md | 6 +++--- README.md | 6 +++--- bin/version.txt | 2 +- docs/js/version.js | 2 +- hutool-all/pom.xml | 2 +- hutool-aop/pom.xml | 2 +- hutool-bloomFilter/pom.xml | 2 +- hutool-bom/pom.xml | 2 +- hutool-cache/pom.xml | 2 +- hutool-captcha/pom.xml | 2 +- hutool-core/pom.xml | 2 +- hutool-cron/pom.xml | 2 +- hutool-crypto/pom.xml | 2 +- hutool-db/pom.xml | 2 +- hutool-dfa/pom.xml | 2 +- hutool-extra/pom.xml | 2 +- hutool-http/pom.xml | 2 +- hutool-json/pom.xml | 2 +- hutool-jwt/pom.xml | 2 +- hutool-log/pom.xml | 2 +- hutool-poi/pom.xml | 2 +- hutool-script/pom.xml | 2 +- hutool-setting/pom.xml | 2 +- hutool-socket/pom.xml | 2 +- hutool-system/pom.xml | 2 +- pom.xml | 2 +- 27 files changed, 36 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 208ee2fe9..95e774205 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ ------------------------------------------------------------------------------------------------------------- +# 5.7.20 (2022-01-07) + +### 🐣新特性 +### 🐞Bug修复 + +------------------------------------------------------------------------------------------------------------- # 5.7.19 (2022-01-07) ### 🐣新特性 diff --git a/README-EN.md b/README-EN.md index 07ec93b86..b55c1128d 100644 --- a/README-EN.md +++ b/README-EN.md @@ -142,18 +142,18 @@ We provide the T-Shirt and Sweater with Hutool Logo, please visit the shop: cn.hutool hutool-all - 5.7.19 + 5.7.20 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.7.19' +implementation 'cn.hutool:hutool-all:5.7.20' ``` ## 📥Download -- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.7.19/) +- [Maven Repo](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.7.20/) > 🔔️note: > Hutool 5.x supports JDK8+ and is not tested on Android platforms, and cannot guarantee that all tool classes or tool methods are available. diff --git a/README.md b/README.md index aa2154e23..8aeb70262 100644 --- a/README.md +++ b/README.md @@ -142,20 +142,20 @@ Hutool的存在就是为了减少代码搜索成本,避免网络上参差不 cn.hutool hutool-all - 5.7.19 + 5.7.20 ``` ### 🍐Gradle ``` -implementation 'cn.hutool:hutool-all:5.7.19' +implementation 'cn.hutool:hutool-all:5.7.20' ``` ### 📥下载jar 点击以下链接,下载`hutool-all-X.X.X.jar`即可: -- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.7.19/) +- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.7.20/) > 🔔️注意 > Hutool 5.x支持JDK8+,对Android平台没有测试,不能保证所有工具类或工具方法可用。 diff --git a/bin/version.txt b/bin/version.txt index 1ccc37576..b0917fb0e 100755 --- a/bin/version.txt +++ b/bin/version.txt @@ -1 +1 @@ -5.7.19 +5.7.20 diff --git a/docs/js/version.js b/docs/js/version.js index 90d3c3b3a..978cfac6d 100644 --- a/docs/js/version.js +++ b/docs/js/version.js @@ -1 +1 @@ -var version = '5.7.19' \ No newline at end of file +var version = '5.7.20' \ No newline at end of file diff --git a/hutool-all/pom.xml b/hutool-all/pom.xml index 9dbbfdc1f..10a7032a4 100644 --- a/hutool-all/pom.xml +++ b/hutool-all/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-all diff --git a/hutool-aop/pom.xml b/hutool-aop/pom.xml index 35e36768f..edc46b7a7 100644 --- a/hutool-aop/pom.xml +++ b/hutool-aop/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-aop diff --git a/hutool-bloomFilter/pom.xml b/hutool-bloomFilter/pom.xml index 82e8163aa..abeaec1c1 100644 --- a/hutool-bloomFilter/pom.xml +++ b/hutool-bloomFilter/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-bloomFilter diff --git a/hutool-bom/pom.xml b/hutool-bom/pom.xml index 2db026910..3b8ad4fd4 100644 --- a/hutool-bom/pom.xml +++ b/hutool-bom/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-bom diff --git a/hutool-cache/pom.xml b/hutool-cache/pom.xml index 91a94dc0d..d544b5527 100644 --- a/hutool-cache/pom.xml +++ b/hutool-cache/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-cache diff --git a/hutool-captcha/pom.xml b/hutool-captcha/pom.xml index 4bd96f6e5..5dd8f9f15 100644 --- a/hutool-captcha/pom.xml +++ b/hutool-captcha/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-captcha diff --git a/hutool-core/pom.xml b/hutool-core/pom.xml index 2548d3862..0129bcab8 100644 --- a/hutool-core/pom.xml +++ b/hutool-core/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-core diff --git a/hutool-cron/pom.xml b/hutool-cron/pom.xml index ba2fdbfd2..d95c455b4 100644 --- a/hutool-cron/pom.xml +++ b/hutool-cron/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-cron diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml index 46da18d6b..50f7356ac 100644 --- a/hutool-crypto/pom.xml +++ b/hutool-crypto/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-crypto diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml index 7b35e41ad..92fe54fa8 100644 --- a/hutool-db/pom.xml +++ b/hutool-db/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-db diff --git a/hutool-dfa/pom.xml b/hutool-dfa/pom.xml index 37bd3ae42..183c0eff9 100644 --- a/hutool-dfa/pom.xml +++ b/hutool-dfa/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-dfa diff --git a/hutool-extra/pom.xml b/hutool-extra/pom.xml index 2fd49d272..7fca763ac 100644 --- a/hutool-extra/pom.xml +++ b/hutool-extra/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-extra diff --git a/hutool-http/pom.xml b/hutool-http/pom.xml index de2525d33..a27a4ac72 100644 --- a/hutool-http/pom.xml +++ b/hutool-http/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-http diff --git a/hutool-json/pom.xml b/hutool-json/pom.xml index ef9c36c8a..5103dc136 100644 --- a/hutool-json/pom.xml +++ b/hutool-json/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-json diff --git a/hutool-jwt/pom.xml b/hutool-jwt/pom.xml index f818fc158..7520a39c4 100644 --- a/hutool-jwt/pom.xml +++ b/hutool-jwt/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-jwt diff --git a/hutool-log/pom.xml b/hutool-log/pom.xml index 0d97e4362..075926147 100644 --- a/hutool-log/pom.xml +++ b/hutool-log/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-log diff --git a/hutool-poi/pom.xml b/hutool-poi/pom.xml index 826579e9c..f80d0c8e9 100644 --- a/hutool-poi/pom.xml +++ b/hutool-poi/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-poi diff --git a/hutool-script/pom.xml b/hutool-script/pom.xml index 7a6c33e2c..21854b669 100644 --- a/hutool-script/pom.xml +++ b/hutool-script/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-script diff --git a/hutool-setting/pom.xml b/hutool-setting/pom.xml index cbbc6a4c9..107bd6367 100644 --- a/hutool-setting/pom.xml +++ b/hutool-setting/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-setting diff --git a/hutool-socket/pom.xml b/hutool-socket/pom.xml index 1839e22bf..26529bfd2 100644 --- a/hutool-socket/pom.xml +++ b/hutool-socket/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-socket diff --git a/hutool-system/pom.xml b/hutool-system/pom.xml index 0e2f0ec12..ca87e5d2d 100644 --- a/hutool-system/pom.xml +++ b/hutool-system/pom.xml @@ -9,7 +9,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool-system diff --git a/pom.xml b/pom.xml index 673cdadb7..baad04d0a 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ cn.hutool hutool-parent - 5.7.19 + 5.7.20-SNAPSHOT hutool Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。 https://github.com/dromara/hutool From 31333e476d0ff604d17541055ed11b875fd2187f Mon Sep 17 00:00:00 2001 From: micuncang Date: Fri, 7 Jan 2022 22:50:13 +0800 Subject: [PATCH 02/19] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B1=89=E5=AD=97?= =?UTF-8?q?=E6=AD=A3=E5=88=99=E8=A6=86=E7=9B=96=E6=9B=B4=E5=A4=9A=E6=B1=89?= =?UTF-8?q?=E5=AD=97=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/lang/RegexPool.java | 3 ++- .../src/test/java/cn/hutool/core/lang/ValidatorTest.java | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java b/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java index 7d1295e0c..c2c42acca 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/RegexPool.java @@ -21,8 +21,9 @@ public interface RegexPool { String WORD = "[a-zA-Z]+"; /** * 单个中文汉字 + *
参照维基百科汉字Unicode范围(https://zh.wikipedia.org/wiki/%E6%B1%89%E5%AD%97 页面右侧) */ - String CHINESE = "[\u4E00-\u9FFF]"; + String CHINESE = "[\u2E80-\u2EFF\u2F00-\u2FDF\u31C0-\u31EF\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF\uD840\uDC00-\uD869\uDEDF\uD869\uDF00-\uD86D\uDF3F\uD86D\uDF40-\uD86E\uDC1F\uD86E\uDC20-\uD873\uDEAF\uD87E\uDC00-\uD87E\uDE1F]"; /** * 中文汉字 */ diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java index 652985986..d4dd14272 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/ValidatorTest.java @@ -162,9 +162,18 @@ public class ValidatorTest { @Test public void isChineseTest(){ Assert.assertTrue(Validator.isChinese("全都是中文")); + Assert.assertTrue(Validator.isChinese("㐓㐘")); Assert.assertFalse(Validator.isChinese("not全都是中文")); } + @Test + public void hasChineseTest() { + Assert.assertTrue(Validator.hasChinese("黄单桑米")); + Assert.assertTrue(Validator.hasChinese("Kn 四兄弟")); + Assert.assertTrue(Validator.hasChinese("\uD840\uDDA3")); + Assert.assertFalse(Validator.hasChinese("Abc")); + } + @Test public void isUUIDTest(){ Assert.assertTrue(Validator.isUUID(IdUtil.randomUUID())); From f914faa0debbe59dbc1ae981c7dbef88b3205d52 Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 8 Jan 2022 13:36:57 +0800 Subject: [PATCH 03/19] fix bug --- CHANGELOG.md | 3 +- .../java/cn/hutool/core/bean/BeanDesc.java | 44 ++++------- .../java/cn/hutool/core/bean/BeanUtil.java | 7 +- .../core/lang/reflect/MethodHandleUtil.java | 5 +- .../java/cn/hutool/core/util/ReflectUtil.java | 78 ++++++++++++++++++- .../cn/hutool/core/bean/Issue2082Test.java | 33 ++++++++ 6 files changed, 129 insertions(+), 41 deletions(-) create mode 100755 hutool-core/src/test/java/cn/hutool/core/bean/Issue2082Test.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 95e774205..aba46ae03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,11 @@ ------------------------------------------------------------------------------------------------------------- -# 5.7.20 (2022-01-07) +# 5.7.20 (2022-01-08) ### 🐣新特性 ### 🐞Bug修复 +* 【core 】 修复setter重载导致匹配错误(issue#2082@Github) ------------------------------------------------------------------------------------------------------------- # 5.7.19 (2022-01-07) diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java index 65411b497..976f40d29 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java @@ -140,14 +140,12 @@ public class BeanDesc implements Serializable { * @return this */ private BeanDesc init() { - final Method[] methods = ReflectUtil.getMethods(this.beanClass); + final Method[] gettersAndSetters = ReflectUtil.getMethods(this.beanClass, ReflectUtil::isGetterOrSetterIgnoreCase); PropDesc prop; for (Field field : ReflectUtil.getFields(this.beanClass)) { - if (false == ModifierUtil.isStatic(field) && - // 排除对象子类 - false == "this$0".equals(field.getName())) { - //只针对非static属性 - prop = createProp(field, methods); + // 排除静态属性和对象子类 + if (false == ModifierUtil.isStatic(field) && false == ReflectUtil.isOuterClassField(field)) { + prop = createProp(field, gettersAndSetters); // 只有不存在时才放入,防止父类属性覆盖子类属性 this.propMap.putIfAbsent(prop.getFieldName(), prop); } @@ -190,12 +188,12 @@ public class BeanDesc implements Serializable { /** * 查找字段对应的Getter和Setter方法 * - * @param field 字段 - * @param methods 类中所有的方法 - * @param ignoreCase 是否忽略大小写匹配 + * @param field 字段 + * @param gettersOrSetters 类中所有的Getter或Setter方法 + * @param ignoreCase 是否忽略大小写匹配 * @return PropDesc */ - private PropDesc findProp(Field field, Method[] methods, boolean ignoreCase) { + private PropDesc findProp(Field field, Method[] gettersOrSetters, boolean ignoreCase) { final String fieldName = field.getName(); final Class fieldType = field.getType(); final boolean isBooleanField = BooleanUtil.isBoolean(fieldType); @@ -203,24 +201,19 @@ public class BeanDesc implements Serializable { Method getter = null; Method setter = null; String methodName; - Class[] parameterTypes; - for (Method method : methods) { - parameterTypes = method.getParameterTypes(); - if (parameterTypes.length > 1) { - // 多于1个参数说明非Getter或Setter - continue; - } - + for (Method method : gettersOrSetters) { methodName = method.getName(); - if (parameterTypes.length == 0) { + if (method.getParameterCount() == 0) { // 无参数,可能为Getter方法 if (isMatchGetter(methodName, fieldName, isBooleanField, ignoreCase)) { // 方法名与字段名匹配,则为Getter方法 getter = method; } } else if (isMatchSetter(methodName, fieldName, isBooleanField, ignoreCase)) { - // 只有一个参数的情况下方法名与字段名对应匹配,则为Setter方法 - setter = method; + // setter方法的参数类型和字段类型必须一致,或参数类型是字段类型的子类 + if(fieldType.isAssignableFrom(method.getParameterTypes()[0])){ + setter = method; + } } if (null != getter && null != setter) { // 如果Getter和Setter方法都找到了,不再继续寻找 @@ -261,15 +254,6 @@ public class BeanDesc implements Serializable { handledFieldName = StrUtil.upperFirst(fieldName); } - if (false == methodName.startsWith("get") && false == methodName.startsWith("is")) { - // 非标准Getter方法 - return false; - } - if ("getclass".equals(methodName)) { - //跳过getClass方法 - return false; - } - // 针对Boolean类型特殊检查 if (isBooleanField) { if (fieldName.startsWith("is")) { diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java index 796124648..d9452cd14 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -88,9 +88,8 @@ public class BeanUtil { */ public static boolean hasSetter(Class clazz) { if (ClassUtil.isNormalClass(clazz)) { - final Method[] methods = clazz.getMethods(); - for (Method method : methods) { - if (method.getParameterTypes().length == 1 && method.getName().startsWith("set")) { + for (Method method : clazz.getMethods()) { + if (method.getParameterCount() == 1 && method.getName().startsWith("set")) { // 检测包含标准的setXXX方法即视为标准的JavaBean return true; } @@ -110,7 +109,7 @@ public class BeanUtil { public static boolean hasGetter(Class clazz) { if (ClassUtil.isNormalClass(clazz)) { for (Method method : clazz.getMethods()) { - if (method.getParameterTypes().length == 0) { + if (method.getParameterCount() == 0) { if (method.getName().startsWith("get") || method.getName().startsWith("is")) { return true; } diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/reflect/MethodHandleUtil.java b/hutool-core/src/main/java/cn/hutool/core/lang/reflect/MethodHandleUtil.java index 781208744..fbfa2ded3 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/reflect/MethodHandleUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/reflect/MethodHandleUtil.java @@ -12,6 +12,7 @@ import java.lang.reflect.Method; /** * 方法句柄{@link MethodHandle}封装工具类
+ * 方法句柄是一个有类型的,可以直接执行的指向底层方法、构造器、field等的引用,可以简单理解为函数指针,它是一种更加底层的查找、调整和调用方法的机制。 * 参考: *