512. Java 方法句柄 - 操作数组

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 操作数组,实际上就是把平常的数组操作(newarr[i] = valuearr[i]arr.length)封装成了 方法句柄。这在需要 动态处理数组类型编写框架 时非常有用。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容