488. Java 反射 - 动态创建数组

488. Java 反射 - 动态创建数组

在日常代码里,我们通常这样创建数组:

java 复制代码
int[] numbers = new int[10];

但在 反射 API 中,我们也可以使用 java.lang.reflect.Array 类来动态创建任意类型、任意维度的数组。这在 运行时才知道类型和大小 的场景中非常有用(例如框架、序列化、数据映射等)。


1. 使用 Array.newInstance() 创建数组

下面的代码演示了如何用反射创建一个长度为 10 的 int 数组,并对其进行操作:

java 复制代码
int length = 10;

// 创建一个 int[10]
Object o = Array.newInstance(int.class, 10);

// 判断是否为数组
boolean isArray = o.getClass().isArray();
System.out.println("isArray = " + isArray);

// 获取数组的元素类型
Class<?> componentType = o.getClass().getComponentType();
System.out.println("componentType = " + componentType);

// 获取数组长度
int reflectiveLength = Array.getLength(o);
System.out.println("reflectiveLength = " + reflectiveLength);

// 给数组赋值
for (int i = 0; i < reflectiveLength; i++) {
    Array.set(o, i, 2 * i);
}

// 打印数组内容
System.out.println(Arrays.toString((int[]) o));

输出结果:

java 复制代码
isArray = true
componentType = int
reflectiveLength = 10
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

📌 逐行解释:

  • Array.newInstance(int.class, 10) → 创建 int[10]
  • o.getClass().isArray() → 确认对象 o 的类型确实是数组
  • o.getClass().getComponentType() → 得到数组元素类型(这里是 int
  • Array.getLength(o) → 动态获取数组长度
  • Array.set(o, i, 2*i) → 给第 i 个元素赋值

2. 避免装箱与拆箱

Array 类提供了专门针对 基本类型get/set 方法,比如:

  • Array.getInt(Object array, int index) / Array.setInt(Object array, int index, int value)
  • Array.getDouble(Object array, int index) / Array.setDouble(Object array, int index, double value)

👉 使用这些方法可以避免 装箱(boxing)/拆箱(unboxing) 的性能开销。

⚠️ 注意事项:

  1. 如果调用 Array.setFloat() 但传入 Float 对象而不是 float,会抛 IllegalArgumentException
  2. 宽类型转换允许,例如:Array.setInt() 可以操作 long[](因为 intlong 是安全的拓宽转换)。
  3. 但反过来不行,Array.setLong() 不能操作 int[],因为可能丢失精度。

3. 越界访问

就像普通数组一样,如果你尝试访问超出数组长度的索引,会抛出:

java 复制代码
java.lang.ArrayIndexOutOfBoundsException

4. 扩展:多维数组

反射也支持 多维数组,例如:

java 复制代码
// 创建一个 3x3 的二维数组
Object matrix = Array.newInstance(int.class, 3, 3);

// 设置 [1][2] 元素
Array.set(Array.get(matrix, 1), 2, 99);

System.out.println(Arrays.deepToString((int[][]) matrix));

输出:

java 复制代码
[[0, 0, 0], [0, 0, 99], [0, 0, 0]]

🎯 总结

  • Array.newInstance() → 动态创建数组(支持多维)
  • Array.getLength() → 获取数组长度
  • Array.get() / Array.set() → 读写数组元素(Object 版本)
  • Array.getInt() / Array.setInt() 等 → 基本类型高效访问
  • ⚠️ 注意装箱/拆箱,以及宽化/窄化转换规则
相关推荐
Synmbrf1 小时前
ECharts 饼图鼠标悬浮后标签 title 消失的问题
前端·javascript
Canace1 小时前
用 AI 写了一天代码,为什么反而更累了?
前端·人工智能·ai编程
Vhen1 小时前
Taro 封装小程序toast提示组件
前端
苏三说技术1 小时前
LangChain4j 入门指南
后端
用户250694921611 小时前
React项目打包为.next文件部署
前端
tryCbest1 小时前
Html设置网站图标
前端·html
半个落月1 小时前
从页面跳转到前端路由:手写一个简单的 HashRouter
前端
做前端的娜娜子1 小时前
移动端上拉加载与下拉刷新实现方案
前端·面试·掘金·金石计划
Arvid1 小时前
MCP 协议史上最大更新:从有状态走向无状态
后端