512. Java 方法句柄 - 操作数组
MethodHandles 类中内置了一些“预设方法句柄”(preset method handles),专门用于 数组的创建、读取、修改和长度获取。
这些方法句柄的一个特点是:不需要访问检查(access checking),因此创建它们时 不需要 Lookup 对象。
1. 创建数组 🏗️
在 JAVA 9+ 要创建数组,可以使用 arrayConstructor()。
它会返回一个方法句柄,用来动态构造指定类型的数组。
MethodHandle arrayConstructor = MethodHandles.arrayConstructor(String[].class);
// 创建一个长度为 5 的 String 数组
String[] arr = (String[]) arrayConstructor.invoke(5);
System.out.println(arr.length); // 输出: 5
👉 注意:这里的 invoke(5) 表示构造长度为 5 的数组。
2. 修改数组元素 ✏️
要设置数组中的某个元素,可以使用 arrayElementSetter()。
MethodHandle elementSetter = MethodHandles.arrayElementSetter(String[].class);
// 设置下标为 4 的元素
elementSetter.invoke(arr, 4, "test");
System.out.println(Arrays.toString(arr));
// 输出: [null, null, null, null, test]
参数顺序:数组对象、索引、新值。
3. 读取数组元素 📖
要读取数组中的某个元素,可以使用 arrayElementGetter()。
MethodHandle elementGetter = MethodHandles.arrayElementGetter(String[].class);
// 获取下标为 4 的元素
String element = (String) elementGetter.invoke(arr, 4);
System.out.println(element); // 输出: test
参数顺序:数组对象、索引。
4. 获取数组长度 📏
要获取数组的长度,可以使用 arrayLength()。
MethodHandle arrayLength = MethodHandles.arrayLength(String[].class);
int length = (int) arrayLength.invoke(arr);
System.out.println("length = " + length); // 输出: 5
5. 比喻 🎯
-
arrayConstructor👉 就像“数组工厂”,能随时生产指定长度的新数组。 -
arrayElementSetter👉 就像“编辑器”,能在数组的某个格子里写入值。 -
arrayElementGetter👉 就像“放大镜”,能取出某个格子里的值。 -
arrayLength👉 就像“卷尺”,能快速测量数组有多长。
✅ 总结:
用 MethodHandles 操作数组,实际上就是把平常的数组操作(new、arr[i] = value、arr[i]、arr.length)封装成了 方法句柄。这在需要 动态处理数组类型 或 编写框架 时非常有用。