我知道 C# 允许您在unsafe
上下文中使用指针。但是Java有一些类似的内存访问方法吗?
Java 没有指针(有充分的理由),所以如果有类似的内存访问方法,它究竟会是什么?
我知道 C# 允许您在unsafe
上下文中使用指针。但是Java有一些类似的内存访问方法吗?
Java 没有指针(有充分的理由),所以如果有类似的内存访问方法,它究竟会是什么?
不,你不能。
最接近的方法是使用 JNI 并调用 C 函数,该函数返回给定内存位置的数据。
嗯,有一个 sun.misc.Unsafe 类。它允许直接访问内存,因此您可以实现一些魔术,例如重新解释强制转换等。问题是您需要使用 hacky 反射方法来获取实例,而这个类并没有很好的记录。一般来说,你需要一个很好的理由在生产代码中使用这种工具。
这是一个如何获取它的示例:
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
有 105 种方法,允许使用不同的低级内容。这些方法专门用于直接内存访问:
编辑:此方法可能与 OpenJDK 的未来版本或任何其他 JVM 实现不兼容,因为它不是公共 API 的一部分。尽管很多 OpenJDK 代码使用了 Unsafe,但它的实现仍然是一个更改的主题,恕不另行通知。感谢所有在评论中指出这一点的人。
标准 Java 使用直接内存缓冲区为您提供非托管内存的直接内存地址。您可以在 Java 中使用该方法分配直接内存缓冲区ByteBuffer.allocateDirect
,或者在 C 或 C++ 中使用NewDirectByteBuffer
JNI 函数。您不能访问任意内存位置,但对于大多数用途而言,访问直接内存缓冲区就足够了,特别是因为该NewDirectByteBuffer
函数允许将完全任意的内存区域包装在ByteBuffer
.
不,Java 没有任何用于访问任意内存位置的语言内机制。JNI 可以执行操作系统允许的任何(不安全和非托管)操作,但这与您所获得的一样接近。