2

我想知道是否可以通过该特定字符串获取对象的某些字符串值以访问同一机器(同一 RAM)或同一 VM 上的该对象。

例如

Object objA1 = new Object();
System.out.print(objA1.adress); => output: d146a6581ed9e
Object objExt = Object.buildFromMemoryAdress("d146a6581ed9e");

我希望你能理解我想要理解的东西。

编辑:我发现

http://javapapers.com/core-java/address-of-a-java-object/#&slider1=1

一个允许我获取(VM?)内存上实例的逻辑地址字符串的类:sun.misc.Unsafe

我想我也可以使用 Unsafe 从(仅限于 VM?)内存中检索对象。

如果不可能这样,我该怎么做,并且出于好奇,是否还有其他语言(尤其是高端语言)允许像这样直接访问内存?

4

3 回答 3

5

假设您在toString()结果中看到的数字是内存地址是不正确的。

实际上,它是对象的哈希码。如果对象没有被修改,它的哈希码保持不变。但是,它的内存地址可以随时更改:压缩垃圾收集器可以决定随时移动内存中的对象。

于 2012-01-18T08:31:57.350 回答
3

绝对不。事实上,这显然是不可能的,因为您显然可以有两个不同的对象,它们的toString()方法返回相同的字符串。举个简单的例子:

Integer a = new Integer(10);
Integer b = new Integer(10);

Object x = Object.buildFromToString("10");

应该x参考什么?指的是同一个对象a,还是指的是同一个对象b

toString()并不意味着返回对象标识符 - 它只是意味着返回对象的某种文本表示。不应仅仅因为默认实现返回的东西看起来有点像标识符,就表明它应该用作标识符。

如果您想存储在其他时间点访问对象的某种方式,我建议您只需将对它的引用存储为Object变量。

于 2012-01-18T08:30:07.510 回答
2

不,这是不可能的。Java 对象只有在您引用了这些对象时才能访问。您可以做的是将对象存储在Map<String, Object>给定名称下,并使用映射从其名称中获取对象的引用。

于 2012-01-18T08:31:32.180 回答