2012-01-18 108 views
2

我想知道是否有可能得到一个对象的某些字符串值来访问该对象在同一台机器(同一RAM)或相同VM上通过特定的的toString结果串。构造一个新的对象()与另一个对象

例如

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?)内存中检索对象。

如果不能这样,我会怎么做,因为它是出于好奇有没有允许这样的直接存储器访问的任何其他语言(尤其是高端)?

回答

3

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

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

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

x应该指什么? a所引用的相同对象,还是与b所指的对象相同?

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

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

+1

+1也可尝试新的'字节(10)的ToString()'和' “10” 的ToString()' – 2012-01-18 09:04:02

+0

那么这将是一个对象标识符? HashCode不是唯一的,对吗? 我编辑了我的问题很多,因为我有很多关于toString的答案。 – sinekonata 2012-01-18 10:05:19

+0

@sinekonata:答案集中在'toString()'上,因为问题是:)我不知道在某些文本表示中获得有用对象标识符的方法 - 最简单的方法就是保持对该对象的引用在代码中。如果你想...你可以创建一个从你自己的对象标识符到对象引用的映射(可能通过'WeakReference'),但是你不知道你想要实现什么。 – 2012-01-18 10:09:16

2

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

5

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

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

+0

+1:多个对象可以具有相同的散列码。即使'System.identityHashCode(Object)' – 2012-01-18 09:02:39

+0

谢谢我没有认为它是地址。我想知道一些散列码是否可以是唯一的,如果是的话,可以从另一个单独的项目中检索。你回答并放弃了这种可能性,但我仍然想知道如何去做。我编辑了我的问题很多,因为我有很多关于toString的答案。 – sinekonata 2012-01-18 10:04:43