diff --git a/CHANGELOG.md b/CHANGELOG.md index 214100db4..620cc6c7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ * 【core 】 改进Bean判断和注入逻辑:支持public字段注入(issue#I1689L@Gitee) * 【extra】 新增SpringUtil * 【http 】 Get请求支持body,移除body(JSON)方法(issue#671@Github) +* 【core 】 ReflectUtil修正getFieldValue逻辑,防止歧义 ### Bug修复 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 f4f220b11..2391d4ecb 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 @@ -199,7 +199,7 @@ public class ReflectUtil { /** * 获取字段值 * - * @param obj 对象 + * @param obj 对象,如果static字段,此处为类 * @param fieldName 字段名 * @return 字段值 * @throws UtilException 包装IllegalAccessException异常 @@ -208,7 +208,19 @@ public class ReflectUtil { if (null == obj || StrUtil.isBlank(fieldName)) { return null; } - return getFieldValue(obj, getField(obj.getClass(), fieldName)); + return getFieldValue(obj, getField(obj instanceof Class ? (Class)obj : obj.getClass(), fieldName)); + } + + /** + * 获取静态字段值 + * + * @param field 字段 + * @return 字段值 + * @throws UtilException 包装IllegalAccessException异常 + * @since 5.1.0 + */ + public static Object getStaticFieldValue(Field field) throws UtilException { + return getFieldValue(null, field); } /** @@ -223,6 +235,11 @@ public class ReflectUtil { if (null == field) { return null; } + if(obj instanceof Class){ + // 静态字段获取时对象为null + obj = null; + } + setAccessible(field); Object result; try { @@ -236,13 +253,13 @@ public class ReflectUtil { /** * 获取所有字段的值 * - * @param obj bean对象 + * @param obj bean对象,如果是static字段,此处为类class * @return 字段值数组 * @since 4.1.17 */ public static Object[] getFieldsValue(Object obj) { if (null != obj) { - final Field[] fields = getFields(obj.getClass()); + final Field[] fields = getFields(obj instanceof Class ? (Class)obj : obj.getClass()); if (null != fields) { final Object[] values = new Object[fields.length]; for (int i = 0; i < fields.length; i++) { diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ReflectUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ReflectUtilTest.java index 385c22583..3d0836019 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/ReflectUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ReflectUtilTest.java @@ -1,14 +1,12 @@ package cn.hutool.core.util; -import java.lang.reflect.Field; -import java.lang.reflect.Method; - +import cn.hutool.core.lang.test.bean.ExamInfoDict; +import cn.hutool.core.util.ClassUtilTest.TestSubClass; import org.junit.Assert; import org.junit.Test; -import cn.hutool.core.lang.Filter; -import cn.hutool.core.lang.test.bean.ExamInfoDict; -import cn.hutool.core.util.ClassUtilTest.TestSubClass; +import java.lang.reflect.Field; +import java.lang.reflect.Method; /** * 反射工具类单元测试 @@ -24,13 +22,7 @@ public class ReflectUtilTest { Assert.assertEquals(22, methods.length); //过滤器测试 - methods = ReflectUtil.getMethods(ExamInfoDict.class, new Filter() { - - @Override - public boolean accept(Method t) { - return Integer.class.equals(t.getReturnType()); - } - }); + methods = ReflectUtil.getMethods(ExamInfoDict.class, t -> Integer.class.equals(t.getReturnType())); Assert.assertEquals(4, methods.length); final Method method = methods[0]; @@ -76,6 +68,13 @@ public class ReflectUtilTest { Field privateField = ReflectUtil.getField(TestSubClass.class, "privateField"); Assert.assertNotNull(privateField); } + + @Test + public void getFieldsTest() { + // 能够获取到父类字段 + final Field[] fields = ReflectUtil.getFields(TestSubClass.class); + Assert.assertEquals(4, fields.length); + } @Test public void setFieldTest() {