有没有办法获取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,但我无法实现它。这就是为什么,我问了这个问题。
答案 0 :(得分:19)
首先 - 不,你不能在Java中获取对象的地址;至少,不是没有调试代理等的纯Java。一方面,地址可以随着时间的推移而移动。你不需要它。
其次,稍微有点难以理解你的解释,但你肯定不会能够在不听取文件本身更改的情况下离开。将文件加载到Properties
对象后,除非您专门重新加载,否则对该对象中的文件上的任何更改都不会显示。
基本上你应该监听文件的更改(或轮询它)并在那时重新加载文件(或者重新加载到Properties
或覆盖现有的文件)。您还是否需要监听字符串容器的更新将取决于您的应用程序。
答案 1 :(得分:7)
我们可以在内存中获取对象的地址。那怎么样?就像那样;
在java中使用sun.misc.Unsafe类。
创建新的不安全对象并使用getAddress(Object)
;方法,它将返回一个长地址,即地址。
此课程还有很多方法。
您可以使用putInt(Object,long offset, int value)
或类似方法更改此地址中的值。(获取一些值getnt(Object)
)。
注意:此课程实际上是 UNSAFE 。如果您在项目中出错, JVM 将被停止。
答案 2 :(得分:5)
System.identityHashCode(obj)
提供了下一个最好的东西:每个对象都有一个唯一的数字。它对应于默认的Object.hashCode()
实现。
引用API:“尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但是这个JavaTM编程语言不需要实现技术。)“。
答案 3 :(得分:1)
查看Apache Commons配置。该库支持动态重新加载(例如)属性文件。请参阅here。
答案 4 :(得分:1)
观察某些文件更改的最佳方法是使用sha1或mda5制作哈希值,并将值保存在缓存中。并且你创建一个每分钟,几秒钟的线程,取决于你观察文件更改的频率,并对文件进行哈希值。因此,您可以比较这两个值,如果值不相等,则可以重新加载新文件。
答案 5 :(得分:1)
Java不像C / C ++。在C ++中,您经常使用地址(C ++程序员有一个概念调用指针)。但是,我担心不是用Java。 Java非常安全,可以阻止您触摸其地址。
但是,其他方法可能与您的想法相同,使用HashCode。对象的HashCode基于HEAP上的地址。