From 4451cebe204c0d32d17bfe488eb9751d908879fe Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 14 Jul 2024 18:18:10 +0800 Subject: [PATCH] fix code --- .../hutool/core/bean/BeanDescFactory.java | 7 ++ .../dromara/hutool/core/bean/PropDesc.java | 1 + .../hutool/core/bean/SimpleBeanDesc.java | 85 ++++++++++++++ .../hutool/core/bean/StrictBeanDesc.java | 13 ++- .../hutool/core/net/url/UrlQueryUtil.java | 7 +- .../reflect/method/MethodMatcherUtil.java | 8 +- .../core/reflect/method/MethodNameUtil.java | 109 ++++++++++++++++++ .../core/reflect/method/MethodUtil.java | 18 +-- .../org/dromara/hutool/core/regex/ReUtil.java | 54 +++++---- .../hutool/core/text/CharSequenceUtil.java | 46 -------- .../org/dromara/hutool/core/xml/XmlUtil.java | 3 +- .../hutool/core/bean/BeanDescTest.java | 16 +++ .../hutool/core/util/Issue3136Test.java | 4 +- .../dromara/hutool/core/util/ReUtilTest.java | 7 +- 14 files changed, 286 insertions(+), 92 deletions(-) create mode 100644 hutool-core/src/main/java/org/dromara/hutool/core/bean/SimpleBeanDesc.java create mode 100644 hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodNameUtil.java diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanDescFactory.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanDescFactory.java index f3595a364..ec0a7992f 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanDescFactory.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanDescFactory.java @@ -12,7 +12,11 @@ package org.dromara.hutool.core.bean; +import org.dromara.hutool.core.array.ArrayUtil; import org.dromara.hutool.core.map.reference.WeakConcurrentMap; +import org.dromara.hutool.core.reflect.FieldUtil; + +import java.lang.reflect.Proxy; /** * Bean描述信息工厂类
@@ -48,6 +52,9 @@ public class BeanDescFactory { public static BeanDesc getBeanDescWithoutCache(final Class clazz) { if (RecordUtil.isRecord(clazz)) { return new RecordBeanDesc(clazz); + }else if(Proxy.isProxyClass(clazz) || ArrayUtil.isEmpty(FieldUtil.getFields(clazz))){ + // 代理类和空字段的Bean不支持属性获取,直接使用方法方式 + return new SimpleBeanDesc(clazz); } else { return new StrictBeanDesc(clazz); } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/PropDesc.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/PropDesc.java index 2344b1f9f..8ab54f434 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/PropDesc.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/PropDesc.java @@ -326,6 +326,7 @@ public class PropDesc { public String toString() { return "PropDesc{" + "field=" + field + + ", fieldName=" + fieldName + ", getter=" + getter + ", setter=" + setter + '}'; diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/SimpleBeanDesc.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/SimpleBeanDesc.java new file mode 100644 index 000000000..92093e4bd --- /dev/null +++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/SimpleBeanDesc.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2024. looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * https://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.bean; + +import org.dromara.hutool.core.bean.path.AbstractBeanDesc; +import org.dromara.hutool.core.reflect.method.MethodNameUtil; +import org.dromara.hutool.core.reflect.method.MethodUtil; + +import java.lang.reflect.Method; +import java.util.Map; + +/** + * 简单的Bean描述,只查找getter和setter方法 + * + * @author Looly + * @since 6.0.0 + */ +public class SimpleBeanDesc extends AbstractBeanDesc { + private static final long serialVersionUID = 1L; + + /** + * 构造 + * + * @param beanClass Bean类 + */ + public SimpleBeanDesc(final Class beanClass) { + super(beanClass); + init(); + } + + /** + * 普通Bean初始化,查找和加载getter和setter
+ */ + private void init() { + final Map propMap = this.propMap; + + final Method[] gettersAndSetters = MethodUtil.getPublicMethods(this.beanClass, MethodUtil::isGetterOrSetterIgnoreCase); + boolean isSetter; + int nameIndex; + String methodName; + String fieldName; + for (final Method method : gettersAndSetters) { + methodName = method.getName(); + switch (methodName.charAt(0)){ + case 's': + isSetter = true; + nameIndex = 3; + break; + case 'g': + isSetter = false; + nameIndex = 3; + break; + case 'i': + isSetter = false; + nameIndex = 2; + break; + default: + continue; + } + + fieldName = MethodNameUtil.decapitalize(methodName.substring(nameIndex)); + PropDesc propDesc = propMap.get(fieldName); + if(null == propDesc){ + propDesc = new PropDesc(fieldName, isSetter ? null : method, isSetter ? method : null); + propMap.put(fieldName, propDesc); + } else{ + if(isSetter){ + propDesc.setter = method; + }else{ + propDesc.getter = method; + } + } + } + } +} diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/StrictBeanDesc.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/StrictBeanDesc.java index 1f2e69613..bda2e2df1 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/StrictBeanDesc.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/StrictBeanDesc.java @@ -15,6 +15,7 @@ package org.dromara.hutool.core.bean; import org.dromara.hutool.core.bean.path.AbstractBeanDesc; import org.dromara.hutool.core.reflect.FieldUtil; import org.dromara.hutool.core.reflect.ModifierUtil; +import org.dromara.hutool.core.reflect.method.MethodNameUtil; import org.dromara.hutool.core.reflect.method.MethodUtil; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.util.BooleanUtil; @@ -158,12 +159,12 @@ public class StrictBeanDesc extends AbstractBeanDesc { methodName = method.getName(); if (0 == method.getParameterCount()) { // 无参数,可能为Getter方法 - if (StrUtil.equals(methodName, StrUtil.genGetter(fieldName), ignoreCase) && + if (StrUtil.equals(methodName, MethodNameUtil.genGetter(fieldName), ignoreCase) && method.getReturnType().isAssignableFrom(fieldType)) { // getter的返回类型必须为字段类型或字段的父类 getter = method; } - } else if (StrUtil.equals(methodName, StrUtil.genSetter(fieldName), ignoreCase) && + } else if (StrUtil.equals(methodName, MethodNameUtil.genSetter(fieldName), ignoreCase) && fieldType.isAssignableFrom(method.getParameterTypes()[0])) { // setter方法的参数必须为字段类型或字段的子类 setter = method; @@ -198,7 +199,7 @@ public class StrictBeanDesc extends AbstractBeanDesc { return false; } - if (StrUtil.startWith(fieldName, "is", ignoreCase)) { + if (StrUtil.startWith(fieldName, MethodNameUtil.IS_PREFIX, ignoreCase)) { // isName -》 isName if (StrUtil.equals(fieldName, m.getName(), ignoreCase)) { return true; @@ -207,7 +208,7 @@ public class StrictBeanDesc extends AbstractBeanDesc { // name -》 isName // isName -》 isIsName - return StrUtil.equals(StrUtil.upperFirstAndAddPre(fieldName, "is"), m.getName(), ignoreCase); + return StrUtil.equals(StrUtil.upperFirstAndAddPre(fieldName, MethodNameUtil.IS_PREFIX), m.getName(), ignoreCase); }); } @@ -231,10 +232,10 @@ public class StrictBeanDesc extends AbstractBeanDesc { return false; } - if (StrUtil.startWith(fieldName, "is", ignoreCase)) { + if (StrUtil.startWith(fieldName, MethodNameUtil.IS_PREFIX, ignoreCase)) { // isName -》 setName return StrUtil.equals( - "set" + StrUtil.removePrefix(fieldName, "is", ignoreCase), + MethodNameUtil.SET_PREFIX + StrUtil.removePrefix(fieldName, MethodNameUtil.IS_PREFIX, ignoreCase), m.getName(), ignoreCase); } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/net/url/UrlQueryUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/net/url/UrlQueryUtil.java index 37f2dbf49..efd942238 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/net/url/UrlQueryUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/net/url/UrlQueryUtil.java @@ -13,6 +13,7 @@ package org.dromara.hutool.core.net.url; import org.dromara.hutool.core.convert.Convert; +import org.dromara.hutool.core.lang.Console; import org.dromara.hutool.core.map.MapUtil; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.util.CharsetUtil; @@ -211,12 +212,14 @@ public class UrlQueryUtil { return MapUtil.empty(); } + Console.log(queryMap); + final Map> params = new LinkedHashMap<>(); queryMap.forEach((key, value) -> { - if(null != key && null != value){ + if(null != key){ final List values = params.computeIfAbsent(key.toString(), k -> new ArrayList<>(1)); // 一般是一个参数 - values.add(key.toString()); + values.add(StrUtil.toStringOrNull(value)); } }); return params; diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodMatcherUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodMatcherUtil.java index 6bede8018..d7eb33bce 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodMatcherUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodMatcherUtil.java @@ -197,12 +197,12 @@ public class MethodMatcherUtil { Objects.requireNonNull(fieldName); Objects.requireNonNull(fieldType); // 匹配方法名为 get + 首字母大写的属性名的无参数方法 - Predicate nameMatcher = forName(CharSequenceUtil.upperFirstAndAddPre(fieldName, "get")); + Predicate nameMatcher = forName(CharSequenceUtil.upperFirstAndAddPre(fieldName, MethodNameUtil.GET_PREFIX)); // 查找方法名为属性名的无参数方法 nameMatcher = nameMatcher.or(forName(fieldName)); if (Objects.equals(boolean.class, fieldType) || Objects.equals(Boolean.class, fieldType)) { - // 匹配方法名为 get + 首字母大写的属性名的无参数方法 - nameMatcher = nameMatcher.or(forName(CharSequenceUtil.upperFirstAndAddPre(fieldName, "is"))); + // 匹配方法名为 is + 首字母大写的属性名的无参数方法 + nameMatcher = nameMatcher.or(forName(CharSequenceUtil.upperFirstAndAddPre(fieldName, MethodNameUtil.IS_PREFIX))); } return allMatch(nameMatcher, forReturnType(fieldType), forNoneParameter()); } @@ -237,7 +237,7 @@ public class MethodMatcherUtil { public static Predicate forSetterMethod(final String fieldName, final Class fieldType) { Objects.requireNonNull(fieldName); Objects.requireNonNull(fieldType); - final Predicate nameMatcher = forName(CharSequenceUtil.upperFirstAndAddPre(fieldName, "set")) + final Predicate nameMatcher = forName(CharSequenceUtil.upperFirstAndAddPre(fieldName, MethodNameUtil.SET_PREFIX)) .or(forName(fieldName)); return allMatch(nameMatcher, forParameterTypes(fieldType)); } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodNameUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodNameUtil.java new file mode 100644 index 000000000..45bb0a1ec --- /dev/null +++ b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodNameUtil.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2024. looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * https://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.core.reflect.method; + +import org.dromara.hutool.core.lang.Assert; +import org.dromara.hutool.core.text.StrUtil; + +import java.beans.Introspector; + +/** + * 方法名相关工具,如生成Getter和Setter方法,获取其字段名等。 + * + * @author Looly + * @since 6.0.0 + */ +public class MethodNameUtil { + + /** + * getter方法前缀 + */ + public static final String GET_PREFIX = "get"; + /** + * setter方法前缀 + */ + public static final String SET_PREFIX = "set"; + /** + * is方法前缀 + */ + public static final String IS_PREFIX = "is"; + + /** + * 转换名称为标准的字段名称,规则为: + *
    + *
  • 首字母小写
  • + *
  • 转悠名字保持大写(第一个和第二个字母均为大写)
  • + *
+ * + *
+	 * Name =》name
+	 * name =》name
+	 * CPU  =》CPU
+	 * 
+ * + * @param name 字段名称 + * @return 转换后的名称 + * @see java.beans.Introspector#decapitalize(String) + */ + public static String decapitalize(final CharSequence name) { + return Introspector.decapitalize(StrUtil.toStringOrNull(name)); + } + + /** + * 获得set或get或is方法对应的标准属性名
+ * 例如:setName 返回 name + * + *
+	 * getName =》name
+	 * setName =》name
+	 * isName  =》name
+	 * 
+ *

+ * 需要注意的是,相比{@link java.beans.Introspector#decapitalize(String)},此方法始终小写第一个字符。 + * + * @param getOrSetMethodName Get或Set方法名 + * @return 如果是set或get方法名,返回field, 否则null + * @see java.beans.Introspector#decapitalize(String) + */ + public static String getGeneralField(final CharSequence getOrSetMethodName) { + Assert.notBlank(getOrSetMethodName); + final String getOrSetMethodNameStr = getOrSetMethodName.toString(); + if (getOrSetMethodNameStr.startsWith(GET_PREFIX) || getOrSetMethodNameStr.startsWith(SET_PREFIX)) { + return StrUtil.removePreAndLowerFirst(getOrSetMethodName, 3); + } else if (getOrSetMethodNameStr.startsWith(IS_PREFIX)) { + return StrUtil.removePreAndLowerFirst(getOrSetMethodName, 2); + } + return null; + } + + /** + * 生成set方法名
+ * 例如:name 返回 setName + * + * @param fieldName 属性名 + * @return setXxx + */ + public static String genSetter(final CharSequence fieldName) { + return StrUtil.upperFirstAndAddPre(fieldName, SET_PREFIX); + } + + /** + * 生成get方法名 + * + * @param fieldName 属性名 + * @return getXxx + */ + public static String genGetter(final CharSequence fieldName) { + return StrUtil.upperFirstAndAddPre(fieldName, GET_PREFIX); + } +} diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodUtil.java index a7dbcf157..0a84e8456 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/method/MethodUtil.java @@ -482,14 +482,14 @@ public class MethodUtil { String name = method.getName(); // 跳过set这类特殊方法 - if ("set".equals(name)) { + if (name.length() < 4) { return false; } if (ignoreCase) { name = name.toLowerCase(); } - return name.startsWith("set"); + return name.startsWith(MethodNameUtil.SET_PREFIX); } /** @@ -511,14 +511,18 @@ public class MethodUtil { } // 参数个数必须为0或1 - final int parameterCount = method.getParameterCount(); - if (0 != parameterCount) { + if (0 != method.getParameterCount()) { + return false; + } + + // 必须有返回值 + if(Void.class == method.getReturnType()){ return false; } String name = method.getName(); // 跳过getClass、get、is这类特殊方法 - if ("getClass".equals(name) || "get".equals(name) || "is".equals(name)) { + if (name.length() < 3 || "getClass".equals(name) || MethodNameUtil.GET_PREFIX.equals(name)) { return false; } @@ -526,11 +530,11 @@ public class MethodUtil { name = name.toLowerCase(); } - if (name.startsWith("is")) { + if (name.startsWith(MethodNameUtil.IS_PREFIX)) { // 判断返回值是否为Boolean return BooleanUtil.isBoolean(method.getReturnType()); } - return name.startsWith("get"); + return name.startsWith(MethodNameUtil.GET_PREFIX); } // region ----- invoke diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/regex/ReUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/regex/ReUtil.java index 5280c9d38..9e8f1cb55 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/regex/ReUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/regex/ReUtil.java @@ -12,7 +12,6 @@ package org.dromara.hutool.core.regex; -import org.dromara.hutool.core.array.ArrayUtil; import org.dromara.hutool.core.collection.set.SetUtil; import org.dromara.hutool.core.comparator.CompareUtil; import org.dromara.hutool.core.comparator.StrLengthComparator; @@ -867,33 +866,42 @@ public class ReUtil { * * @param content 文本 * @param pattern {@link Pattern} - * @param replacementTemplate 替换的文本模板,可以使用$1类似的变量提取正则匹配出的内容 + * @param replacementTemplate 替换的文本模板,可以使用$1类似的变量提取正则匹配出的内容,null表示去除匹配 * @return 处理后的文本 * @since 3.0.4 */ - public static String replaceAll(final CharSequence content, final Pattern pattern, final String replacementTemplate) { - if(null != pattern && StrUtil.isNotEmpty(content) && StrUtil.isNotEmpty(replacementTemplate)){ - final Matcher matcher = pattern.matcher(content); - boolean result = matcher.find(); - if (result) { - final Set varNums = findAll(PatternPool.GROUP_VAR, replacementTemplate, 1, - new TreeSet<>(StrLengthComparator.INSTANCE.reversed())); - final StringBuffer sb = new StringBuffer(); - do { - String replacement = replacementTemplate; - for (final String var : varNums) { - final int group = Integer.parseInt(var); - replacement = replacement.replace("$" + var, matcher.group(group)); - } - matcher.appendReplacement(sb, escape(replacement)); - result = matcher.find(); - } while (result); - matcher.appendTail(sb); - return sb.toString(); - } + public static String replaceAll(final CharSequence content, final Pattern pattern, String replacementTemplate) { + if (StrUtil.isEmpty(content)) { + return StrUtil.toStringOrNull(content); } - return StrUtil.toStringOrNull(replacementTemplate); + // replacementTemplate字段为null时按照去除匹配对待 + if(null == replacementTemplate){ + replacementTemplate = StrUtil.EMPTY; + } + Assert.notNull(replacementTemplate, "ReplacementTemplate must be not null !"); + + final Matcher matcher = pattern.matcher(content); + boolean result = matcher.find(); + if (result) { + final Set varNums = findAll(PatternPool.GROUP_VAR, replacementTemplate, 1, + new TreeSet<>(StrLengthComparator.INSTANCE.reversed())); + final StringBuffer sb = new StringBuffer(); + do { + String replacement = replacementTemplate; + for (final String var : varNums) { + final int group = Integer.parseInt(var); + replacement = replacement.replace("$" + var, matcher.group(group)); + } + matcher.appendReplacement(sb, escape(replacement)); + result = matcher.find(); + } while (result); + matcher.appendTail(sb); + return sb.toString(); + } + + // 无匹配结果,返回原字符串 + return StrUtil.toStringOrNull(content); } /** diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java index e34426665..1070e57a8 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/text/CharSequenceUtil.java @@ -3678,52 +3678,6 @@ public class CharSequenceUtil extends StrValidator { return sb; } - // ------------------------------------------------------------------------ getter and setter - - /** - * 获得set或get或is方法对应的标准属性名
- * 例如:setName 返回 name - * - *

-	 * getName =》name
-	 * setName =》name
-	 * isName  =》name
-	 * 
- * - * @param getOrSetMethodName Get或Set方法名 - * @return 如果是set或get方法名,返回field, 否则null - */ - public static String getGeneralField(final CharSequence getOrSetMethodName) { - final String getOrSetMethodNameStr = getOrSetMethodName.toString(); - if (getOrSetMethodNameStr.startsWith("get") || getOrSetMethodNameStr.startsWith("set")) { - return removePreAndLowerFirst(getOrSetMethodName, 3); - } else if (getOrSetMethodNameStr.startsWith("is")) { - return removePreAndLowerFirst(getOrSetMethodName, 2); - } - return null; - } - - /** - * 生成set方法名
- * 例如:name 返回 setName - * - * @param fieldName 属性名 - * @return setXxx - */ - public static String genSetter(final CharSequence fieldName) { - return upperFirstAndAddPre(fieldName, "set"); - } - - /** - * 生成get方法名 - * - * @param fieldName 属性名 - * @return getXxx - */ - public static String genGetter(final CharSequence fieldName) { - return upperFirstAndAddPre(fieldName, "get"); - } - // ------------------------------------------------------------------------ other /** diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/xml/XmlUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/xml/XmlUtil.java index f6e7c8d53..5256b59c5 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/xml/XmlUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/xml/XmlUtil.java @@ -135,8 +135,9 @@ public class XmlUtil extends XmlConstants { */ public static Document parseXml(final String xmlStr) { if (StrUtil.isBlank(xmlStr)) { - throw new IllegalArgumentException("XML content string is empty !"); + throw new IllegalArgumentException("XML content string is blank !"); } + return readXml(StrUtil.getReader(cleanInvalid(xmlStr))); } // endregion diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/bean/BeanDescTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/bean/BeanDescTest.java index eab6856b9..52b277510 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/bean/BeanDescTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/bean/BeanDescTest.java @@ -89,6 +89,22 @@ public class BeanDescTest { Assertions.assertEquals("张三", value); } + @Test + void simpleBeanDescTest() { + final SimpleBeanDesc desc = new SimpleBeanDesc(User.class); + + final User user = new User(); + desc.getProp("name").setValue(user, "张三"); + Assertions.assertEquals("张三", user.getName()); + Object value = desc.getProp("name").getValue(user); + Assertions.assertEquals("张三", value); + + desc.getProp("admin").setValue(user, true); + Assertions.assertTrue(user.isAdmin()); + value = desc.getProp("admin").getValue(user); + Assertions.assertEquals(true, value); + } + public static class User { private String name; private int age; diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/util/Issue3136Test.java b/hutool-core/src/test/java/org/dromara/hutool/core/util/Issue3136Test.java index b4383bdbd..d98285a7e 100755 --- a/hutool-core/src/test/java/org/dromara/hutool/core/util/Issue3136Test.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/util/Issue3136Test.java @@ -16,6 +16,7 @@ import lombok.Data; import org.dromara.hutool.core.xml.XmlUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.w3c.dom.Document; import java.util.ArrayList; import java.util.List; @@ -31,7 +32,8 @@ public class Issue3136Test { @Test void xmlToBeanTest() { final String xmlStr = "02"; - final SmsRes smsRes = XmlUtil.xmlToBean(XmlUtil.parseXml(xmlStr).getDocumentElement(), SmsRes.class); + final Document doc = XmlUtil.parseXml(xmlStr); + final SmsRes smsRes = XmlUtil.xmlToBean(doc.getDocumentElement(), SmsRes.class); Assertions.assertEquals("02", smsRes.getCode()); Assertions.assertEquals(new Message(), smsRes.getMessage()); diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/util/ReUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/util/ReUtilTest.java index c2066ff4a..8078c8104 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/util/ReUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/util/ReUtilTest.java @@ -146,8 +146,11 @@ public class ReUtilTest { final String replaceAll = ReUtil.replaceAll(content, pattern, parameters -> "->" + parameters.group(1) + "<-"); assertEquals("ZZZaaabbbccc中文->1234<-", replaceAll); - // 修改后:判断ReUtil.replaceAll()方法,当replacementTemplate为null对象时,提示为非法的参数异常:ReplacementTemplate must be not null ! - Assertions.assertThrows(IllegalArgumentException.class, () -> ReUtil.replaceAll(content, pattern, str)); + // 修改后:判断ReUtil.replaceAll()方法,当replacementTemplate为null对象时按照""处理,表示去除匹配 + String s = ReUtil.replaceAll(content, pattern, str); + assertEquals("ZZZaaabbbccc中文", s); + s = ReUtil.replaceAll(content, pattern, ""); + assertEquals("ZZZaaabbbccc中文", s); } @Test