15

有没有办法获取 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,但无法实现。这就是为什么,我问了这个问题。

4

6 回答 6

22

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

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

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

于 2009-09-01T06:37:07.823 回答
13

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

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

于 2009-09-01T07:05:50.713 回答
7

我们可以获取内存中对象的地址。怎么样?就是这样;

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

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

这个类也有很多方法。

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

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

于 2014-12-24T09:15:50.750 回答
1

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

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

于 2012-03-28T09:12:52.417 回答
1

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

于 2009-09-01T07:05:20.700 回答
1

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

于 2009-09-01T11:15:52.083 回答