我知道C#允许您在unsafe
上下文中使用指针。但是Java有一些类似的内存访问方法吗?
Java没有指针(有充分的理由),所以如果有类似的内存访问方法,它究竟会是什么?
答案 0 :(得分:4)
不,你不能。
最接近的是使用JNI并调用一个C函数,该函数返回给定内存位置的数据。
答案 1 :(得分:3)
嗯,有一个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,但它的实现仍然是一个变化的主题,没有任何通知。感谢所有在评论中指出这一点的人。
答案 2 :(得分:2)
标准Java使用直接内存缓冲区为非托管内存提供直接内存地址。您可以使用ByteBuffer.allocateDirect
方法在Java中分配直接内存缓冲区,或使用NewDirectByteBuffer
JNI函数在C或C ++中分配直接内存缓冲区。您无法访问任意内存位置,但是对于大多数用途来说,访问直接内存缓冲区已足够,特别是因为NewDirectByteBuffer
函数允许在ByteBuffer
中包装完全任意的内存区域。
答案 3 :(得分:1)
不,Java没有任何用于访问任意内存位置的语言机制。 JNI可以执行操作系统允许的任何(不安全和非托管)操作,但这种操作尽可能接近。