簡體   English   中英

如何在 Java 9+ 中創建一個 varhandle 來訪問數組的元素

[英]How to create a varhandle to access elements of an array in Java 9+

我正在嘗試轉換一些使用 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()才能做到這一點?

我不熟悉調用 API,所以對這個答案VarHandle ,但為什么你不能只使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM