【问题标题】:How to get address of a Java Object? [duplicate]如何获取 Java 对象的地址? [复制]
【发布时间】:2009-09-01 06:26:36
【问题描述】:

有没有办法获取 Java 对象的地址?

问题从何而来?: 首先,我读取属性文件并将文件中的所有数据放入表中。属性文件可以更新。所以,我想听那个文件。我使用 PropertyChangeSupport 和 PropertyChangeListener 监听一个对象。

updatedStatus = new basit.data.MyString();
    updatedStatus.addPropertyChangeListener(new java.beans.PropertyChangeListener() {

        //After changes "i", we inform the table model about new value
            public void propertyChange(PropertyChangeEvent evt) {
                Object objec=evt.getNewValue();
                tableModel.setValueAt(objec.toString(), 0, 5);
            }
        });

如果 updatedStatus 发生变化,那么我会更新表。 MyString 类有私有字符串“值”。我想听属性文件。因此,它应该使 updatedStatus.value 和属性文件的字符串在同一地址处相等。如果我能做到,那么我就不需要监听属性文件了。

updatedStatus.setValue(resourceMap.getString("HDI.Device.1.Name"));

我尝试使用 StringBuffer,但无法实现。这就是为什么,我问了这个问题。

【问题讨论】:

    标签: java string stringbuffer object-address


    【解决方案1】:

    首先 - 不,您无法在 Java 中获取对象的地址;至少,不是没有调试代理等的纯Java。一方面,地址可以随时间移动。你不需要它。

    其次,您的解释有点难以理解,但您肯定不会不听文件本身的更改就可以逃脱。将文件加载到 Properties 对象后,以后对磁盘上的文件所做的任何更改将不会在该对象中可见,除非您专门重新加载它。

    基本上,您应该监听文件的更改(或轮询)并在此时重新加载文件(进入新的Properties 或覆盖现有文件)。您是否需要监听字符串容器的更新将取决于您的应用程序。

    【讨论】:

    【解决方案2】:

    System.identityHashCode(obj) 提供了次优的东西:每个对象都有一个唯一的数字。它对应于默认的Object.hashCode() 实现。

    引用 API:“尽可能合理地实用,由 Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但是这JavaTM 编程语言不需要实现技术。)”。

    【讨论】:

    • Object.hashCodeSystem.identityHashCode 绝对不提供唯一编号。有一个 RFE 来阐明 API 文档。
    • 请注意,描述中写的是“尽可能多的合理实用”。不能保证 Object.hashCode() 为每个对象返回一个唯一的数字,不同的 JVM 实现可能与 Sun 的 JVM 不同。
    • GC 可以随时移动对象,更新对它们的所有引用。那么为什么System.identityHashCode的标准实现要使用对象的地址,如果对象可以移动呢?
    【解决方案3】:

    我们可以得到一个对象在内存中的地址。怎么样?就是这样;

    在 java 中使用 sun.misc.Unsafe 类。

    创建新的 Unsafe 对象并使用getAddress(Object);方法,它将返回一个长值,即地址。

    这个类也有很多方法。

    您可以使用putInt(Object,long offset, int value) 或类似此方法更改此地址中的值。(获取一些值getnt(Object))。

    注意:这个类真的是 UNSAFE 。如果您在项目中做错了事情,JVM 将被停止。

    【讨论】:

    • 实际上 getAddress 接受原始长类型值。
    【解决方案4】:

    查看 Apache Commons 配置。该库支持(例如)属性文件的动态重新加载。见here

    【讨论】:

      【解决方案5】:

      观察某些文件是否更改的最佳方法是恕我直言,使用 sha1 或 mda5 生成哈希值并将该值保存在缓存中。你创建一个线程,每分钟,每秒,取决于你观察文件更改的频率,并在文件上生成哈希值。因此,您可以比较这两个值,如果值不相等,则可以重新加载新文件。

      【讨论】:

        【解决方案6】:

        Java 不像 C/C++。在 C++ 中,您经常使用地址(C++ 程序员有一个概念调用指针)。但是,我担心这不是在 Java 中。 Java 非常安全,可以防止您触摸它的地址。

        但是,还有其他可能与您的想法相同的方法是使用 HashCode。对象的 HashCode 基于其在 HEAP 上的地址。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-28
          • 1970-01-01
          • 2015-02-18
          • 1970-01-01
          • 2018-10-19
          相关资源
          最近更新 更多