如何获取Java对象的地址?

Igu*_*amu 12 java string stringbuffer object-address

有没有办法获取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);
            }
        });
Run Code Online (Sandbox Code Playgroud)

如果updatedStatus更改,那么我更新表.MyString类具有私有字符串"Value".我想听属性文件.因此,它应该使updatedStatus.value和属性文件的字符串在相同的地址相等.如果我能做到,所以我不需要听属性文件.

updatedStatus.setValue(resourceMap.getString("HDI.Device.1.Name"));
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 21

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

其次,按照你的解释稍微有点难度,但如果不听取文件本身的更改,你肯定无法逃脱.将文件加载到Properties对象后,除非您专门重新加载,否则对该文件中的文件的任何更改都将在该对象中可见.

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


Sem*_*van 8

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

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

创建新的不安全对象并使用getAddress(Object); 方法,它将返回一个长地址,即地址.

此课程还有很多方法.

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

注意:这个类真的是UNSAFE.如果您在项目中出错,JVM将被停止.

  • 实际上 getAddress 接受原始 long 类型值。 (2认同)

mfx*_*mfx 7

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

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

  • `Object.hashCode`和`System.identityHashCode`绝对不会给出唯一的数字.有一个RFE来澄清API文档. (4认同)
  • 请注意,描述说"尽可能合理".无法保证Object.hashCode()为每个对象返回唯一编号,不同的JVM实现可能与Sun的JVM不同. (3认同)
  • 据说 GC 可以随时移动对象,更新对它们的所有引用。那么,如果对象可以移动,为什么“System.identityHashCode”的标准实现要使用对象的地址呢? (2认同)