【问题标题】:Construct a new Object() with the toString result of another Object用另一个 Object 的 toString 结果构造一个 new Object()
【发布时间】:2012-01-18 08:27:19
【问题描述】:

我想知道是否可以通过该特定字符串获取对象的某些字符串值以访问同一机器(同一 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?)内存中检索对象。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • +1:多个对象可以有相同的哈希码。即使是System.identityHashCode(Object)
    • 谢谢 我不认为这是地址。我想知道某些哈希码是否可以是唯一的,如果可以,可以从另一个单独的项目中检索。您回答并放弃了这种可能性,但我仍然想知道该怎么做。我对问题进行了很多编辑,因为我有很多关于 toString 的答案。
    【解决方案2】:

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

    Integer a = new Integer(10);
    Integer b = new Integer(10);
    
    Object x = Object.buildFromToString("10");
    

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

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

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

    【讨论】:

    • 那么什么是对象标识符? HashCode 也不是唯一的,对吧?我对问题进行了很多编辑,因为我有很多关于 toString 的答案。
    • @sinekonata:答案集中在toString(),因为问题确实如此:) 我不知道有什么方法可以在某些文本表示中获得有用的对象标识符 - 最简单的方法就是保持对代码中对象的引用。如果您愿意,您可能会创建一个从 您自己的 对象标识符到对象引用的映射(可能通过WeakReference)......但目前尚不清楚您要实现的目标。
    • 我只是想做机器可以做的事情,即读取对象的地址并告诉机器使用给定的地址构造另一个对象。如前所述,这只是出于好奇。 sun.misc.Unsafe 类似乎可以进行硬件操作,我想知道是否有比直接访问内存更简单的方法。
    • @sinekonata:你不是打算在 Java 中这样做 - 它是一种托管语言。 VM 能够在内存中移动对象并为您精确地做各种事情因为您不会自己弄乱内部结构。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-09-13
      • 1970-01-01
      • 2014-01-26
      • 2015-09-25
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      相关资源
      最近更新 更多