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;