如何创建一个 varhandle 来访问 Java 中数组的元素 9+
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 有 arrayElementVarHandle(int[].class)
其中 returns 一个 VarHandle。也许我需要以某种方式将 VarHandle 转换回 MethodHandle,然后对其调用 arrayElementVarHandle()
才能执行此操作?
我不熟悉调用 API,所以对这个答案持保留态度,但为什么不能只使用 MethodHandles.arrayElementVarHandle
返回的 VarHandle
?执行以下操作似乎可以访问元素:
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
我正在尝试转换一些使用 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)
其中 returns 一个 VarHandle。也许我需要以某种方式将 VarHandle 转换回 MethodHandle,然后对其调用 arrayElementVarHandle()
才能执行此操作?
我不熟悉调用 API,所以对这个答案持保留态度,但为什么不能只使用 MethodHandles.arrayElementVarHandle
返回的 VarHandle
?执行以下操作似乎可以访问元素:
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