java - 如何创建一个 varhandle 来访问 Java 9+ 中的数组元素

标签 java arrays methodhandle

我正在尝试转换一些代码,这些代码使用 Unsafe 来对类中的局部变量执行内存访问,而且这些代码似乎也使用 Unsafe 来访问数组中的元素。

我有以下代码为单个元素创建 VarHandle,它似乎可以工作。

// where self is a class object, and VarName is the name of the class member
return MethodHandles.privateLookupIn(self, MethodHandles.lookup()).
    findVarHandle(self, varName, self);

我还了解到您还可以使用 VarHandles 来访问数组元素。使用上面的代码,我可以获得对整个数组的引用,但我不太清楚如何构造 VarHandle 以便我可以使用它来访问数组元素。

我看到 MethodHandle 具有返回 VarHandle 的 arrayElementVarHandle(int[].class)。也许我需要以某种方式将 VarHandle 转换回 MethodHandle,然后对其调用 arrayElementVarHandle() 才能执行此操作?

最佳答案

我不熟悉 invoke API,所以对这个答案持保留态度,但为什么不能只使用 MethodHandles.arrayElementVarHandleVarHandle?执行以下操作似乎可以访问元素:

import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
import java.util.Arrays;

public class Main {

  public static void main(String[] args) {
    VarHandle varHandle = MethodHandles.arrayElementVarHandle(int[].class);

    int[] array = new int[5];

    printArray(array);
    varHandle.set(array, 2, 5);
    printArray(array);

    System.out.println(varHandle.get(array, 2));
  }

  private static void printArray(int[] array) {
    System.out.println(Arrays.toString(array));
  }

}

输出:

[0, 0, 0, 0, 0]
[0, 0, 5, 0, 0]
5

关于java - 如何创建一个 varhandle 来访问 Java 9+ 中的数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52980060/

相关文章:

Java数组对象编译问题

arrays - 在 Perl 中,如何将从数据库中读取的数组转换为哈希?

c++ - 为什么 std::array 不包含初始化列表构造函数

java - 使用 MethodHandle::invokeExact 作为方法引用导致的 LambdaConversionException 导致的 BootstrapMethodError

java - AsyncTask - 如何将对象作为参数传递给匿名 AsyncTask 类

java - JFileChooser 扩展

java - 如何使用外部 java 库在命令行中编译和运行 kotlin 程序

javascript - 为什么每次点击时数组都会重新初始化?

java-7 - Java-7 中的签名多态方法

java - 如何方便地包装对调用者敏感的 API?