我知道C#允许在unsafe上下文中使用指针。但是Java有类似的内存访问方法吗?
Java没有指针(出于很好的理由),所以如果有类似的内存访问方法,那么它到底是什么呢?
发布于 2013-08-11 14:15:20
有一个sun.misc.Unsafe类。它允许直接访问内存,因此您可以实现一些魔术,比如重新解释强制转换等等。问题是,您需要使用hacky反射方法来获取实例,而且这个类并没有得到很好的文档。一般来说,您需要一个非常好的理由在生产代码中使用这种工具。
下面是一个如何获得它的示例:
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);有105种方法,允许不同的低水平的东西。这些方法用于直接访问内存:
编辑:此方法可能与未来版本的OpenJDK或任何其他OpenJDK实现不兼容,因为它不是公共OpenJDK的一部分。尽管许多OpenJDK代码使用不安全,但它的实现仍然是一个未经任何通知的更改主题。感谢所有在评论中指出这一点的人。
发布于 2013-08-11 14:09:27
不,你不能。
可以得到的最接近的方法是使用JNI并调用一个C函数,该函数在给定的内存位置返回数据。
发布于 2013-08-11 14:23:39
标准Java使用直接内存缓冲区向非托管内存提供直接内存地址。您可以使用ByteBuffer.allocateDirect方法在Java中分配直接内存缓冲区,也可以用NewDirectByteBuffer JNI函数在C或C++中分配一个直接内存缓冲区。您不能访问任意内存位置,但是对直接内存缓冲区的访问在大多数情况下都足够了,特别是因为NewDirectByteBuffer函数允许在ByteBuffer中包装一个完全任意的内存区域。
https://stackoverflow.com/questions/18172790
复制相似问题