java反射中java.lang.reflect.array类提供动态创建、访问和修改数组的静态工具方法,支持基本类型和引用类型;通过array.newinstance()创建数组,用array.getxxx()/setxxx()读写元素,array.getlength()和getcomponenttype()获取元信息。

Java 反射中通过 java.lang.reflect.Array 类可以在运行时动态创建、访问和修改数组对象,无需编译期知道数组类型或长度。它是一组静态工具方法的集合,专用于处理所有类型的数组(包括基本类型和引用类型),是反射操作数组的核心支持类。
动态创建数组对象
使用 Array.newInstance() 方法可按指定类型和维度创建新数组。关键点:
- 第一个参数可以是
Class对象(如String.class、int.class),也支持多维数组类型(如String[].class) - 后续参数为各维度长度(支持一维到多维),例如
Array.newInstance(int.class, 5)创建长度为 5 的 int 数组;Array.newInstance(String.class, 2, 3)创建 2×3 的 String[][] - 对基本类型数组,传入的是对应包装类的
.TYPE(如int.class),不是Integer.class
示例:
Object arr = Array.newInstance(double.class, 4); // 创建 double[4]Object matrix = Array.newInstance(String.class, 3, 4); // 创建 String[3][4]
读写数组元素
数组本身是 Object,不能直接用 [] 访问,必须通过 Array.getXXX() 和 Array.setXXX() 系列方法:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 获取元素:根据数组组件类型选择方法,如
Array.getInt(arr, index)(int[])、Array.get(arr, index)(Object[] 或泛型数组) - 设置元素:对应有
Array.setInt(arr, index, value)、Array.set(arr, index, value)等 - 注意类型匹配:对基本类型数组,必须用对应类型方法;混用会抛
IllegalArgumentException
示例:
int[] nums = (int[]) Array.newInstance(int.class, 3);Array.setInt(nums, 0, 100);
Array.setInt(nums, 1, 200);
System.out.println(Array.getInt(nums, 0)); // 输出 100
获取数组长度与组件类型
不依赖泛型或 instanceof,反射方式安全获取元信息:
-
Array.getLength(array):返回一维长度(对多维数组,返回第一维长度) -
array.getClass().getComponentType():返回数组元素的Class,例如int[].class.getComponentType() == int.class,String[][].class.getComponentType() == String[].class
这对通用数组处理(如序列化工具、通用复制逻辑)非常有用,可避免硬编码类型判断。
注意事项与常见陷阱
- 不能用
Array.newInstance() 创建泛型数组(如 <code>List<string>[]</string>),因泛型擦除后等价于List[],需用原始类型 - 对多维数组,
Array.get()返回的是子数组(仍是Object),需再次调用Array.get()访问深层元素 - 数组对象本身不可变大小,反射不提供“扩容”能力;如需动态大小,请改用
ArrayList等集合 - 性能低于直接编码操作——反射有额外开销,高频场景慎用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










