Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取Java对象的地址?_Java_String_Stringbuffer_Object Address - Fatal编程技术网

如何获取Java对象的地址?

如何获取Java对象的地址?,java,string,stringbuffer,object-address,Java,String,Stringbuffer,Object Address,有没有办法获取Java对象的地址 问题从何而来 首先,我读取属性文件,文件中的所有数据都放在表中。属性文件可以更新。所以,我想听听那个文件。我使用PropertyChangeSupport和PropertyChangeListener侦听对象 updatedStatus = new basit.data.MyString(); updatedStatus.addPropertyChangeListener(new java.beans.PropertyChangeListener() {

有没有办法获取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
对象后,除非您专门重新加载,否则磁盘上文件的任何后续更改都不会在该对象中可见


基本上,您应该侦听对文件的更改(或轮询),然后在此时重新加载文件(或者加载到新的
属性中,或者覆盖现有文件)。您是否还需要侦听字符串容器上的更新取决于您的应用程序。

查看Apache Commons配置。此库支持动态重新加载(例如)属性文件。请参阅。

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


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

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

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


但是,还有其他可能与您的想法相同的方法是使用HashCode。对象的哈希代码基于它们在堆上的地址。

我们可以获得内存中对象的地址。那怎么办?就是这样,

在java中使用sun.misc.Unsafe类

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

这个类也有很多方法

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


注意:这个类确实不安全。如果您在项目中做了错误的事情,JVM将被停止。

Object.hashCode
System.identityHashCode
绝对不要给出唯一的数字。有一个RFE来澄清API文档。请注意,描述中说“尽可能合理地实际”。无法保证Object.hashCode()为每个对象返回唯一的数字,不同的JVM实现可能与Sun的JVM不一样。GC可以在任何时候移动对象,更新对它们的所有引用。那么,如果对象可以移动,为什么
System.identityHashCode
的标准实现应该使用对象的地址呢?是的,我同意答案。如果您仍然需要,可以使用sun.misc.safe api以一种非常规的方式获取java对象的地址。引用:实际上getAddress接受原语长类型值。