代码之家  ›  专栏  ›  技术社区  ›  BillRobertson42

如何在Java9中创建访问数组元素的varhandle+

  •  1
  • BillRobertson42  · 技术社区  · 7 年前

    我试图转换一些代码,这些代码使用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 回复  |  直到 7 年前
        1
  •  2
  •   Slaw    7 年前

    我不熟悉invoke API,所以对这个答案持保留态度,但是为什么不能直接使用 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