我想知道是否有可能获得一个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。
如果不可能这样,我该怎么做,而且由于好奇心,还有其他语言(尤其是高端语言)允许这样的直接内存访问吗?
答案 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>
中,然后使用地图从名称中获取对象的引用。