我有 C++ 背景。在 C++ 中,我可以存储一个我刚刚在全局数组中新建的内存地址,并在以后重新使用它。例如,假设我有两个类 X、Y,我创建了两个对象 x、y。全局数组 StoreAddresses[2] 定义为:
uint32_t StoreAddresses[2];
我写:
X * x = new X();
Y * y = new Y();
StoreAdresses[0] = (uint32t *) x; //for example, 0x12345678
StoreAdresses[1] = (uint32t *) y; //for example, 0x12345698
在我的程序中的任何地方,我都可以通过调用检索写入内存的数据:
X * stored_x = (X*)StoreAdresses[0];
Y * stored_y = (Y*)StoreAdresses[1];
我如何在 Java 中完成它? 感谢您的帮助!
最佳答案
您可以使用 Unsafe 在 Java 中执行此操作。然而,这是一个非常糟糕的主意。这是因为对象的地址可以随时更改(通过 GC)如果您像这样存储地址并在以后使用它可能不再有效甚至使您的应用程序崩溃。如果 GC 认为一个对象没有强引用,它可能会清理该对象。当您再次尝试引用该对象时,它可能不再存在于 JVM 中。
地址的大小会根据您启动 JVM 的方式而改变。 64 位 JVM 通常使用 32 位引用(这可能来自 C++ 令人惊讶)您可以使用 Unsafe.ADDRESS_SIZE
我只会使用 Unsafe 来查看地址是什么,以查看对象在缓存中的布局方式。 (这不是很有用,因为你对此无能为力 :( )
很可能您尝试做的事情可以用更好的方式完成。你能给我们更多的细节吗?
关于Java:如何像 C++ 一样存储和检索内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8635598/