1

我知道 C# 允许您在unsafe上下文中使用指针。但是Java有一些类似的内存访问方法吗?

Java 没有指针(有充分的理由),所以如果有类似的内存访问方法,它究竟会是什么?

4

4 回答 4

4

不,你不能。

最接近的方法是使用 JNI 并调用 C 函数,该函数返回给定内存位置的数据。

于 2013-08-11T14:09:27.153 回答
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,但它的实现仍然是一个更改的主题,恕不另行通知。感谢所有在评论中指出这一点的人。

于 2013-08-11T14:15:20.063 回答
2

标准 Java 使用直接内存缓冲区为您提供非托管内存的直接内存地址。您可以在 Java 中使用该方法分配直接内存缓冲区ByteBuffer.allocateDirect,或者在 C 或 C++ 中使用NewDirectByteBufferJNI 函数。您不能访问任意内存位置,但对于大多数用途而言,访问直接内存缓冲区就足够了,特别是因为该NewDirectByteBuffer函数允许将完全任意的内存区域包装在ByteBuffer.

于 2013-08-11T14:23:39.983 回答
1

不,Java 没有任何用于访问任意内存位置的语言内机制。JNI 可以执行操作系统允许的任何(不安全和非托管)操作,但这与您所获得的一样接近。

于 2013-08-11T14:10:12.087 回答