如何在Java 9 +

时间:2018-10-25 01:27:53

标签: 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具有arrayElementVarHandle(int[].class),它返回一个VarHandle。也许我需要以某种方式将VarHandle转换回MethodHandle,然后对此调用arrayElementVarHandle()才能做到这一点?

1 个答案:

答案 0 :(得分:1)

我对invoke API并不熟悉,因此请一salt而就,但是为什么不能只使用VarHandle返回的MethodHandles.arrayElementVarHandle?执行以下操作似乎可以访问元素:

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