java反射访问数组元素核心靠array类静态方法,需按元素类型选对读写方法、避免类型错配;动态创建一维数组须传componenttype和长度;多维数组用多参数newinstance;读写须区分基本/引用类型;操作前应检查isarray()和getcomponenttype()确保安全。

Java反射访问数组元素,核心靠 java.lang.reflect.Array 类——它不依赖编译期类型,所有操作都是静态方法,统一用 Object 接收数组实例,再按需调用类型明确的方法读写。关键不是“能不能”,而是“怎么选对方法、避免类型错配”。
动态创建一维数组:必须指定 componentType 和长度
不能用 new 或泛型推导,必须传入元素类型的 Class 对象和整数长度:
- 基本类型用
int.class、boolean.class等;引用类型用String.class、MyClass.class - 调用
Array.newInstance(componentType, length),返回值是Object,需强制转换才能当原生数组使用 - 错误示例:给
String[].class当 componentType 创建数组会失败;用int.class创建Integer[]也不合法
例如:
Object arr = Array.newInstance(String.class, 6);<br> String[] sArr = (String[]) arr;
安全读写元素:区分基本类型与引用类型
对任意数组(反射创建或普通数组)都适用,但方法选择必须匹配元素类型:
- 读取引用类型元素:用
Array.get(array, index),返回Object,再强转 - 读取基本类型元素:用专用方法,如
Array.getInt(array, i)、Array.getDouble(array, i),避免拆箱异常 - 写入引用类型元素:用
Array.set(array, index, value),value必须是Object或其子类 - 写入基本类型元素:用
Array.setInt(array, i, 42)等,不能传Integer给setInt - 获取长度统一用
Array.getLength(array),无需判断是否为基本类型
多维数组创建与逐层访问:一次声明,分步解包
不是嵌套调用 newInstance,而是用 int 数组或多个 int 参数一次性定义各维大小:
- 创建三维 int 数组:
Object arr3d = Array.newInstance(int.class, 2, 3, 4);—— 等价于int[2][3][4] - 访问
arr3d[1][2][3]需三步:
→Object layer1 = Array.get(arr3d, 1);
→Object layer2 = Array.get(layer1, 2);
→int val = Array.getInt(layer2, 3); - 赋值同理,最后一层用
Array.setInt(layer2, 3, 99);中间层始终是Object,不可直接强转为int[],除非确认已到最内维
类型检查与维度识别:保障反射安全的前置动作
操作前建议先验证,避免运行时异常:
- 用
obj.getClass().isArray()判断是否为数组对象 - 用
obj.getClass().getComponentType()获取元素类型,比如String[].class.getComponentType() == String.class - 递归调用
getComponentType()可计算维度数,每调一次说明还有一维,直到返回非数组类型
这类检查在处理未知来源的数组参数(如框架回调、泛型擦除后传入)时特别关键。










