如何获取Java对象的地址?

有没有办法获取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类具有私有字符串“Value”。 我想听属性文件。 因此,它应该使updatedStatus.value和属性文件的字符串在相同的地址相等。 如果我能做到,所以我不需要听属性文件。

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

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

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

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

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

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

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

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

而且这门课还有很多方法。

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

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

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

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

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

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

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

观察某些文件是否更改的最佳方法是使用sha1或mda5制作哈希值并将值保存在缓存中。 并且你创建一个每分钟,几秒钟的线程,取决于你查看文件更改的频率,并对文件进行哈希值。 因此,您可以比较这两个值,如果值不相等,则可以重新加载新文件。