使用另一个Object的toString结果构造一个新的Object()

时间:2012-01-18 08:27:19

标签: java object memory-management object-to-string

我想知道是否有可能获得一个Object的String值来访问同一台机器(相同的RAM)上的Object或通过该特定的String访问同一个VM。

e.g。

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?)内存中检索一个Object。

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

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

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

x应该提到什么? a引用的相同对象,或b引用的同一对象?

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

如果你想在某个其他时间存储一些访问对象的方法,我建议你只是将它的引用存储为Object变量。

答案 2 :(得分:2)

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