From 303c77a08d3236a7a5ca8ac3770e29228a043750 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 1 Sep 2021 22:14:15 +0800 Subject: [PATCH] add null check --- CHANGELOG.md | 1 + .../java/cn/hutool/core/bean/BeanUtil.java | 52 +++++++++++-------- .../cn/hutool/core/bean/BeanUtilTest.java | 7 +++ 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index daaa13539..e0dcb85d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### 🐣新特性 * 【system 】 OshiUtil增加getCurrentProcess方法 * 【extra 】 SpringUtil增加getApplicationName、publishEvent方法(issue#I485NZ@Gitee) +* 【core 】 BeanUtil.getProperty增加判空(issue#I488HA@Gitee) ### 🐞Bug修复 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 5a6f5dbcc..f736a1619 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 @@ -275,7 +275,7 @@ public class BeanUtil { * @param fieldNameOrIndex 字段名或序号,序号支持负数 * @return 字段值 */ - public static Object getFieldValue(Object bean, String fieldNameOrIndex) { + public static Object getFieldValue(Object bean, String fieldNameOrIndex) { if (null == bean || null == fieldNameOrIndex) { return null; } @@ -283,18 +283,18 @@ public class BeanUtil { if (bean instanceof Map) { return ((Map) bean).get(fieldNameOrIndex); } else if (bean instanceof Collection) { - try{ + try { return CollUtil.get((Collection) bean, Integer.parseInt(fieldNameOrIndex)); - } catch (NumberFormatException e){ + } catch (NumberFormatException e) { // 非数字,see pr#254@Gitee - return CollUtil.map((Collection) bean, (beanEle)-> getFieldValue(beanEle, fieldNameOrIndex), false); + return CollUtil.map((Collection) bean, (beanEle) -> getFieldValue(beanEle, fieldNameOrIndex), false); } } else if (ArrayUtil.isArray(bean)) { - try{ + try { return ArrayUtil.get(bean, Integer.parseInt(fieldNameOrIndex)); - } catch (NumberFormatException e){ + } catch (NumberFormatException e) { // 非数字,see pr#254@Gitee - return ArrayUtil.map(bean, Object.class, (beanEle)-> getFieldValue(beanEle, fieldNameOrIndex)); + return ArrayUtil.map(bean, Object.class, (beanEle) -> getFieldValue(beanEle, fieldNameOrIndex)); } } else {// 普通Bean对象 return ReflectUtil.getFieldValue(bean, fieldNameOrIndex); @@ -329,12 +329,15 @@ public class BeanUtil { * @param 属性值类型 * @param bean Bean对象,支持Map、List、Collection、Array * @param expression 表达式,例如:person.friend[5].name - * @return Bean属性值 + * @return Bean属性值,bean为{@code null}或者express为空,返回{@code null} * @see BeanPath#get(Object) * @since 3.0.7 */ @SuppressWarnings("unchecked") public static T getProperty(Object bean, String expression) { + if (null == bean || StrUtil.isBlank(expression)) { + return null; + } return (T) BeanPath.create(expression).get(bean); } @@ -546,7 +549,7 @@ public class BeanUtil { * @since 5.2.4 */ public static T toBean(Object source, Class clazz, CopyOptions options) { - if(null == source){ + if (null == source) { return null; } final T target = ReflectUtil.newInstanceIfPossible(clazz); @@ -717,21 +720,21 @@ public class BeanUtil { * 复制集合中的Bean属性
* 此方法遍历集合中每个Bean,复制其属性后加入一个新的{@link List}中。 * - * @param collection 原Bean集合 - * @param targetType 目标Bean类型 + * @param collection 原Bean集合 + * @param targetType 目标Bean类型 * @param copyOptions 拷贝选项 - * @param Bean类型 + * @param Bean类型 * @return 复制后的List * @since 5.6.4 */ - public static List copyToList(Collection collection, Class targetType, CopyOptions copyOptions){ - if(null == collection){ + public static List copyToList(Collection collection, Class targetType, CopyOptions copyOptions) { + if (null == collection) { return null; } - if(collection.isEmpty()){ + if (collection.isEmpty()) { return new ArrayList<>(0); } - return collection.stream().map((source)->{ + return collection.stream().map((source) -> { final T target = ReflectUtil.newInstanceIfPossible(targetType); copyProperties(source, target, copyOptions); return target; @@ -744,11 +747,11 @@ public class BeanUtil { * * @param collection 原Bean集合 * @param targetType 目标Bean类型 - * @param Bean类型 + * @param Bean类型 * @return 复制后的List * @since 5.6.6 */ - public static List copyToList(Collection collection, Class targetType){ + public static List copyToList(Collection collection, Class targetType) { return copyToList(collection, targetType, CopyOptions.create()); } @@ -764,6 +767,9 @@ public class BeanUtil { * @since 4.0.6 */ public static boolean isMatchName(Object bean, String beanClassName, boolean isSimple) { + if (null == bean || StrUtil.isBlank(beanClassName)) { + return false; + } return ClassUtil.getClassName(bean, isSimple).equals(isSimple ? StrUtil.upperFirst(beanClassName) : beanClassName); } @@ -771,13 +777,13 @@ public class BeanUtil { * 编辑Bean的字段,static字段不会处理
* 例如需要对指定的字段做判空操作、null转""操作等等。 * - * @param bean bean + * @param bean bean * @param editor 编辑器函数 - * @param 被编辑的Bean类型 + * @param 被编辑的Bean类型 * @return bean * @since 5.6.4 */ - public static T edit(T bean, Editor editor){ + public static T edit(T bean, Editor editor) { if (bean == null) { return null; } @@ -803,7 +809,7 @@ public class BeanUtil { * @return 处理后的Bean对象 */ public static T trimStrFields(T bean, String... ignoreFields) { - return edit(bean, (field)->{ + return edit(bean, (field) -> { if (ignoreFields != null && ArrayUtil.containsIgnoreCase(ignoreFields, field.getName())) { // 不处理忽略的Fields return field; @@ -844,7 +850,7 @@ public class BeanUtil { * @return 是否为空,{@code true} - 空 / {@code false} - 非空 * @since 4.1.10 */ - public static boolean isEmpty(Object bean, String... ignoreFiledNames) { + public static boolean isEmpty(Object bean, String... ignoreFiledNames) { if (null != bean) { for (Field field : ReflectUtil.getFields(bean.getClass())) { if (ModifierUtil.isStatic(field)) { 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 3ad01f406..526e8bbca 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 @@ -257,6 +257,13 @@ public class BeanUtilTest { Assert.assertEquals("sub名字", subName); } + @Test + @SuppressWarnings("ConstantConditions") + public void getNullPropertyTest() { + final Object property = BeanUtil.getProperty(null, "name"); + Assert.assertNull(property); + } + @Test public void getPropertyDescriptorsTest() { HashSet set = CollUtil.newHashSet();