From 4e46606e60a057cb4ab7d174ad593ac414d3916d Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 21 Oct 2020 13:12:02 +0800 Subject: [PATCH] fix bean bug --- CHANGELOG.md | 1 + .../java/cn/hutool/core/bean/BeanDesc.java | 3 +- .../java/cn/hutool/core/util/ReflectUtil.java | 30 ++++++++----------- .../cn/hutool/core/bean/BeanUtilTest.java | 2 ++ 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 579fb5573..f63ebfc04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ ### Bug修复 * 【core 】 修复ChineseDate没有忽略时分秒导致计算错误问题(issue#I1YW12@Gitee) * 【core 】 修复FileUtil中,copyFile方法断言判断参数传递错误(issue#I1Z2NY@Gitee) +* 【core 】 修复BeanDesc读取父类属性覆盖子类属性导致的问题(pr#1175@Github) ------------------------------------------------------------------------------------------------------------- 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 79cbfb30b..6fce559db 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 @@ -146,9 +146,8 @@ public class BeanDesc implements Serializable { if (false == ModifierUtil.isStatic(field)) { //只针对非static属性 prop = createProp(field, methods); - PropDesc finalProp = prop; // 只有不存在时才放入,防止父类属性覆盖子类属性 - this.propMap.putIfAbsent(prop.getFieldName(), finalProp); + this.propMap.putIfAbsent(prop.getFieldName(), prop); } } return this; 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 222eb936e..faa4000ca 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 @@ -139,7 +139,7 @@ public class ReflectUtil { } /** - * 查找指定类中的所有字段(包括非public字段),也包括父类和Object类的字段, 字段不存在则返回null + * 查找指定类中的指定name的字段(包括非public字段),也包括父类和Object类的字段, 字段不存在则返回null * * @param beanClass 被查找字段的类,不能为null * @param name 字段名 @@ -148,26 +148,20 @@ public class ReflectUtil { */ public static Field getField(Class beanClass, String name) throws SecurityException { final Field[] fields = getFields(beanClass); - if (ArrayUtil.isNotEmpty(fields)) { - for (Field field : fields) { - if ((name.equals(getFieldName(field)))) { - return field; - } - } - } - return null; + return ArrayUtil.firstMatch((field)->name.equals(getFieldName(field)), fields); } /** - * 获取指定类中字段名和字段对应的Map,包括其父类中的字段 + * 获取指定类中字段名和字段对应的有序Map,包括其父类中的字段
+ * 如果子类与父类中存在同名字段,则这两个字段同时存在,子类字段在前,父类字段在后。 * * @param beanClass 类 - * @return 字段名和字段对应的Map + * @return 字段名和字段对应的Map,有序 * @since 5.0.7 */ public static Map getFieldMap(Class beanClass) { final Field[] fields = getFields(beanClass); - final HashMap map = MapUtil.newHashMap(fields.length); + final HashMap map = MapUtil.newHashMap(fields.length, true); for (Field field : fields) { map.put(field.getName(), field); } @@ -175,7 +169,8 @@ public class ReflectUtil { } /** - * 获得一个类中所有字段列表,包括其父类中的字段 + * 获得一个类中所有字段列表,包括其父类中的字段
+ * 如果子类与父类中存在同名字段,则这两个字段同时存在,子类字段在前,父类字段在后。 * * @param beanClass 类 * @return 字段列表 @@ -192,14 +187,15 @@ public class ReflectUtil { } /** - * 获得一个类中所有字段列表,直接反射获取,无缓存 + * 获得一个类中所有字段列表,直接反射获取,无缓存
+ * 如果子类与父类中存在同名字段,则这两个字段同时存在,子类字段在前,父类字段在后。 * * @param beanClass 类 - * @param withSuperClassFieds 是否包括父类的字段列表 + * @param withSuperClassFields 是否包括父类的字段列表 * @return 字段列表 * @throws SecurityException 安全检查异常 */ - public static Field[] getFieldsDirectly(Class beanClass, boolean withSuperClassFieds) throws SecurityException { + public static Field[] getFieldsDirectly(Class beanClass, boolean withSuperClassFields) throws SecurityException { Assert.notNull(beanClass); Field[] allFields = null; @@ -212,7 +208,7 @@ public class ReflectUtil { } else { allFields = ArrayUtil.append(allFields, declaredFields); } - searchType = withSuperClassFieds ? searchType.getSuperclass() : null; + searchType = withSuperClassFields ? searchType.getSuperclass() : null; } return allFields; diff --git a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java index b56e10769..a74683f05 100644 --- a/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/bean/BeanUtilTest.java @@ -465,6 +465,8 @@ public class BeanUtilTest { @Data public static class HllFoodEntity implements Serializable { + private static final long serialVersionUID = 1L; + private String bookId; @Alias("code") private String code2;