有没有办法将非基元存储在 MemorySegment(例如对象)中?
不,至少不是直接的。对象由 Java 运行时管理,它们不能安全地存储在本机内存中(例如,因为垃圾收集器无法跟踪本机内存中对象内的对象引用)。
但是,如评论中所述,出于您的目的,将数据存储在本机内存中的对象内可能就足够了。例如,如果一个对象仅包含原始字段(尽管可以递归地对对象字段执行相同的操作),则可以将每个此类字段分别写入本机内存。例如(使用 JDK 16 API):
public static void main(String[] args) {
try (MemorySegment segment = MemorySegment.allocateNative(Widget.NATIVE_LAYOUT)) {
Widget widget1 = new Widget(1, 2);
widget1.write(segment);
Widget widget2 = Widget.read(segment);
System.out.println(widget2); // Widget[x=1, y=2]
}
}
record Widget(int x, int y) {
static final MemoryLayout NATIVE_LAYOUT = MemoryLayout.ofStruct(
MemoryLayouts.JAVA_INT.withName("x"),
MemoryLayouts.JAVA_INT.withName("y")
);
static final VarHandle VH_x = NATIVE_LAYOUT.varHandle(int.class, MemoryLayout.PathElement.groupElement("x"));
static final VarHandle VH_y = NATIVE_LAYOUT.varHandle(int.class, MemoryLayout.PathElement.groupElement("y"));
public static Widget read(MemorySegment segment) {
int x = (int) VH_x.get(segment);
int y = (int) VH_y.get(segment);
return new Widget(x, y);
}
public void write(MemorySegment segment) {
VH_x.set(segment, x());
VH_y.set(segment, y());
}
}