diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/DynaBean.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/DynaBean.java index fbc864b50..0d3e866b7 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/DynaBean.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/DynaBean.java @@ -12,6 +12,9 @@ package org.dromara.hutool.core.bean; +import org.dromara.hutool.core.collection.CollUtil; +import org.dromara.hutool.core.collection.ListUtil; +import org.dromara.hutool.core.convert.Convert; import org.dromara.hutool.core.exception.CloneException; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.reflect.ClassUtil; @@ -19,11 +22,13 @@ import org.dromara.hutool.core.reflect.ConstructorUtil; import org.dromara.hutool.core.reflect.method.MethodUtil; import java.io.Serializable; +import java.util.Collection; +import java.util.List; import java.util.Map; /** * 动态Bean,通过反射对Bean的相关方法做操作
- * 支持Map和普通Bean + * 支持Map和普通Bean和Collection * * @author Looly * @since 3.0.7 @@ -81,6 +86,13 @@ public class DynaBean implements Cloneable, Serializable { public T get(final String fieldName) throws BeanException { if (Map.class.isAssignableFrom(beanClass)) { return (T) ((Map) bean).get(fieldName); + } else if (bean instanceof Collection) { + try { + return (T) CollUtil.get((Collection) bean, Integer.parseInt(fieldName)); + } catch (final NumberFormatException e) { + // 非数字,see pr#254@Gitee + return (T) CollUtil.map((Collection) bean, (beanEle) -> BeanUtil.getFieldValue(beanEle, fieldName), false); + } } else { final PropDesc prop = BeanUtil.getBeanDesc(beanClass).getProp(fieldName); if (null == prop) { @@ -100,7 +112,9 @@ public class DynaBean implements Cloneable, Serializable { public boolean containsProp(final String fieldName) { if (Map.class.isAssignableFrom(beanClass)) { return ((Map) bean).containsKey(fieldName); - } else{ + } else if (bean instanceof Collection) { + return CollUtil.size(bean) > Integer.parseInt(fieldName); + } else { return null != BeanUtil.getBeanDesc(beanClass).getProp(fieldName); } } @@ -132,6 +146,8 @@ public class DynaBean implements Cloneable, Serializable { public void set(final String fieldName, final Object value) throws BeanException { if (Map.class.isAssignableFrom(beanClass)) { ((Map) bean).put(fieldName, value); + } else if (bean instanceof List) { + ListUtil.setOrPadding((List) bean, Convert.toInt(fieldName), value); } else { final PropDesc prop = BeanUtil.getBeanDesc(beanClass).getProp(fieldName); if (null == prop) {