diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayUtil.java
index 94561ca94..6fd81599f 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayUtil.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayUtil.java
@@ -21,6 +21,7 @@ import org.dromara.hutool.core.convert.Convert;
import org.dromara.hutool.core.exception.ExceptionUtil;
import org.dromara.hutool.core.exception.HutoolException;
import org.dromara.hutool.core.lang.Assert;
+import org.dromara.hutool.core.lang.Console;
import org.dromara.hutool.core.map.MapUtil;
import org.dromara.hutool.core.text.StrJoiner;
import org.dromara.hutool.core.text.StrUtil;
@@ -553,6 +554,23 @@ public class ArrayUtil extends PrimitiveArrayUtil {
return ArrayWrapper.of(array).setOrAppend(index, value).getRaw();
}
+ /**
+ * 将元素值设置为数组的某个位置,当index小于数组的长度时,替换指定位置的值,否则追加{@code null}或{@code 0}直到到达index后,设置值
+ *
+ * @param 数组类型
+ * @param array 已有数组
+ * @param index 位置,大于等于长度则追加,否则替换
+ * @param value 新值
+ * @return 新数组或原有数组
+ * @since 6.0.0
+ */
+ public static A setOrPadding(final A array, final int index, final Object value) {
+ if (index == 0 && isEmpty(array)) {
+ return ofArray(value, null == array ? null : array.getClass().getComponentType());
+ }
+ return ArrayWrapper.of(array).setOrPadding(index, value).getRaw();
+ }
+
/**
* 从数组中的指定位置开始,按顺序使用新元素替换旧元素
*
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayWrapper.java b/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayWrapper.java
index 91de0216d..86c8d6d15 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayWrapper.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/array/ArrayWrapper.java
@@ -2,8 +2,10 @@ package org.dromara.hutool.core.array;
import org.dromara.hutool.core.collection.iter.ArrayIter;
import org.dromara.hutool.core.convert.Convert;
-import org.dromara.hutool.core.lang.Assert;
+import org.dromara.hutool.core.exception.HutoolException;
import org.dromara.hutool.core.func.Wrapper;
+import org.dromara.hutool.core.lang.Assert;
+import org.dromara.hutool.core.reflect.ClassUtil;
import org.dromara.hutool.core.util.ObjUtil;
import java.lang.reflect.Array;
@@ -266,6 +268,46 @@ public class ArrayWrapper implements Wrapper, Iterable {
}
// endregion
+ /**
+ * 将元素值设置为数组的某个位置,当index小于数组的长度时,替换指定位置的值,否则追加{@code null}或{@code 0}直到到达index后,设置值
+ *
+ * @param index 位置
+ * @param value 新元素或新数组
+ * @return this
+ * @since 6.0.0
+ */
+ @SuppressWarnings("unchecked")
+ public ArrayWrapper setOrPadding(final int index, final E value) {
+ return setOrPadding(index, value, (E) ClassUtil.getDefaultValue(this.componentType));
+ }
+
+ /**
+ * 将元素值设置为数组的某个位置,当index小于数组的长度时,替换指定位置的值,否则追加{@code paddingElement}直到到达index后,设置值
+ *
+ * @param index 位置
+ * @param value 新元素或新数组
+ * @param paddingElement 填充
+ * @return this
+ * @since 6.0.0
+ */
+ public ArrayWrapper setOrPadding(final int index, final E value, final E paddingElement) {
+ if (index < this.length) {
+ Array.set(array, index, value);
+ } else {
+ // issue#3286, 增加安全检查,最多增加2倍
+ if(index > (length + 1) * 2) {
+ throw new HutoolException("Index is too large:", index);
+ }
+
+ for (int i = length; i < index; i++) {
+ append(paddingElement);
+ }
+ append(value);
+ }
+
+ return this;
+ }
+
/**
* 将元素值设置为数组的某个位置,当给定的index大于等于数组长度,则追加
*
@@ -314,7 +356,7 @@ public class ArrayWrapper implements Wrapper, Iterable {
* @return 新数组
*/
public ArrayWrapper insert(final int index, final E element) {
- return insertArray(index, ArrayUtil.ofArray(element));
+ return insertArray(index, ArrayUtil.ofArray(element, this.componentType));
}
/**
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanPath.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanPath.java
index 5476c7356..0f3cd1ad0 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanPath.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanPath.java
@@ -15,6 +15,7 @@ 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.lang.Console;
import org.dromara.hutool.core.map.MapUtil;
import org.dromara.hutool.core.math.NumberUtil;
import org.dromara.hutool.core.text.StrUtil;
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanUtil.java
index 996733b2b..9657a85de 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanUtil.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanUtil.java
@@ -337,11 +337,10 @@ public class BeanUtil {
if (bean instanceof Map) {
((Map) bean).put(fieldNameOrIndex, value);
} else if (bean instanceof List) {
- // 相对于5.x逻辑变更,与数组逻辑保持一致
- ListUtil.setOrAppend((List) bean, Convert.toInt(fieldNameOrIndex), value);
+ ListUtil.setOrPadding((List) bean, Convert.toInt(fieldNameOrIndex), value);
} else if (ArrayUtil.isArray(bean)) {
// issue#3008,追加产生新数组,此处返回新数组
- return ArrayUtil.setOrAppend(bean, Convert.toInt(fieldNameOrIndex), value);
+ return ArrayUtil.setOrPadding(bean, Convert.toInt(fieldNameOrIndex), value);
} else {
// 普通Bean对象
FieldUtil.setFieldValue(bean, fieldNameOrIndex, value);
diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/FieldUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/FieldUtil.java
index 821a8402d..b3b507db9 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/FieldUtil.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/FieldUtil.java
@@ -270,7 +270,7 @@ public class FieldUtil {
* @throws HutoolException 包装IllegalAccessException异常
*/
public static void setFieldValue(final Object obj, final String fieldName, final Object value) throws HutoolException {
- Assert.notNull(obj);
+ Assert.notNull(obj, "Object must be not null !");
Assert.notBlank(fieldName);
final Field field = getField((obj instanceof Class) ? (Class>) obj : obj.getClass(), fieldName);
diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/array/ArrayUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/array/ArrayUtilTest.java
index eabd42dcb..24b46acfe 100644
--- a/hutool-core/src/test/java/org/dromara/hutool/core/array/ArrayUtilTest.java
+++ b/hutool-core/src/test/java/org/dromara/hutool/core/array/ArrayUtilTest.java
@@ -13,6 +13,7 @@
package org.dromara.hutool.core.array;
import org.dromara.hutool.core.collection.ListUtil;
+import org.dromara.hutool.core.lang.Console;
import org.dromara.hutool.core.util.CharsetUtil;
import org.dromara.hutool.core.util.ObjUtil;
import org.junit.jupiter.api.Assertions;
@@ -551,6 +552,14 @@ public class ArrayUtilTest {
Assertions.assertArrayEquals(new int[]{2}, o);
}
+ @Test
+ void setOrPaddingTest(){
+ final String[] arr = new String[0];
+ final String[] newArr = ArrayUtil.setOrPadding(arr, 2, "Good");
+ Console.log(newArr);
+ Assertions.assertArrayEquals(new String[]{null, null, "Good"}, newArr);
+ }
+
@Test
public void getAnyTest() {
final String[] a = {"a", "b", "c", "d", "e"};
diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/bean/BeanPathTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/bean/BeanPathTest.java
index 40fde0ce2..3ff7d1a22 100644
--- a/hutool-core/src/test/java/org/dromara/hutool/core/bean/BeanPathTest.java
+++ b/hutool-core/src/test/java/org/dromara/hutool/core/bean/BeanPathTest.java
@@ -148,6 +148,15 @@ public class BeanPathTest {
Assertions.assertEquals("{list=[[null, {name=张三}]]}", map.toString());
}
+ @Test
+ public void putTest() {
+ final Map map = new HashMap<>();
+
+ BeanPath beanPath = BeanPath.of("list[1].name");
+ beanPath.set(map, "张三");
+ Assertions.assertEquals("{list=[null, {name=张三}]}", map.toString());
+ }
+
@Test
public void putByPathTest() {
final Dict dict = new Dict();