Java反射可通过Array.set()修改对象数组指定索引元素,需先获取并设私有字段为可访问,再校验数组非空及索引有效, newValue须兼容组件类型。

Java反射可以修改对象数组中指定索引位置的元素,但需注意:数组本身是对象,其元素修改本质是调用 Array.setXxx() 方法(如 Array.set(Object array, int index, Object value)),而非直接“替换引用”。对引用类型元素而言,只要新值类型兼容(即赋值类型可转为原数组组件类型),就能成功更新。
获取并校验目标数组字段
若数组是某个对象的私有字段,需先通过反射获取该字段,并设为可访问:
- 用
obj.getClass().getDeclaredField("fieldName")获取字段 - 调用
field.setAccessible(true)绕过访问控制 - 用
field.get(obj)取出数组引用,同时检查是否为数组(array != null && array.getClass().isArray())
安全修改指定索引的元素
使用 java.lang.reflect.Array 工具类操作数组,避免类型强转错误:
-
Array.set(array, index, newValue)适用于所有数组类型(包括对象数组和基本类型数组) - 对引用类型数组,
newValue必须为null或与数组组件类型兼容(如String[]中可设"hello"或null,但不能设Integer) - 索引越界会抛
ArrayIndexOutOfBoundsException,建议提前校验index >= 0 && index
处理泛型数组或运行时类型擦除场景
泛型信息在运行时不可见,反射无法得知 List<String>[] 的实际组件类型,只能依赖编译时约定或额外元数据:
立即学习“Java免费学习笔记(深入)”;
- 若数组声明为
Object[],可存任意引用类型,但后续使用时需手动转型 - 若想确保类型安全,可在修改前用
Array.get(array, index).getClass()检查当前值类型,或通过字段的GenericType解析(仅限字段声明含泛型且未被擦除,如private List<String>[] data;可尝试用field.getGenericType()配合ParameterizedType提取)
引用替换的本质不是“交换指针”,而是赋值
Java 中没有指针概念,所谓“引用替换”实际是将数组槽位中原有的对象引用改为指向另一个对象(或 null):
- 原对象若无其他引用,可能被 GC 回收
- 新对象必须与数组组件类型兼容,否则抛
IllegalArgumentException(如向Number[]写入String) - 对基本类型数组(如
int[]),需用对应方法如Array.setInt(array, index, value),不能用通用set()


















