Как получить адрес объекта Java? [дубликат]

этот вопрос уже есть ответ здесь:

  • есть ли способ получить ссылку-адрес? [дубликат] 5 ответов

есть ли способ получить адрес объекта 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.значение и строка файла свойств равны по одному адресу. Если я могу это сделать, поэтому мне не нужно слушать файл свойств.

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

Я попытался использовать StringBuffer, но не смог добиться этого. Вот почему я задал этот вопрос.

6 ответов


во-первых-нет, вы не можете получить адрес объекта в Java; по крайней мере, не чистая Java без агента отладки и т. д. Во-первых, адрес может меняться со временем. Тебе это не нужно.

во-вторых, немного трудно следовать вашему объяснению, но вы, конечно,не иметь возможность уйти, не дожидаясь изменения в сам файл. После того как вы загрузили файл в Properties объект, любые последующие изменения в файле на диске не быть видимым в этом объекте, если вы специально не перезагрузите его.

в основном вы должны прослушать изменения в файле (или опросить его) и перезагрузить файл (либо в новый Properties или перезапись существующего) в этот момент. Совсем ли ты и необходимость прослушивания обновлений в строковом контейнере будет зависеть от вашего приложения.


мы можем получить адрес объекта в памяти. Ну как? это так;

С помощью солнца.разное.Небезопасный класс в java.

создайте новый небезопасный объект и используйте getAddress(Object); метод и он вернет длинное значение, которое является адресом.

а также есть много методов для этого класса.

вы можете изменить значения в этом адресе, используя putInt(Object,long offset, int value) или такой способ.(получение некоторого значения getnt(Object)).

Примечание: этот класс действительно небезопасных . если вы делаете неправильные вещи в своем проекте,JVM будет прекращена.


System.identityHashCode(obj) обеспечивает следующую лучшую вещь: число, уникальное для каждого объекта. Соответствует значению по умолчанию Object.hashCode() реализация.

чтобы процитировать API: "насколько это разумно практично, метод hashCode, определенный объектом класса, возвращает различные целые числа для различных объектов. (Это обычно реализуется путем преобразования внутренний адрес объекта в целое число, но этот метод реализации не требуется программирования javatm, и язык.)".


Java не нравится C / C++. в C++ вы часто будете работать с адресом (у этого программиста C++ есть указатель вызова концепции). Но, боюсь, что не на Java. Java очень безопасен, что мешает вам коснуться его адреса.

но, есть и другие способы, возможно, то же самое с вашей идеей-использовать хэш-код. Хэш-код базы объектов по их адресу в куче.


посмотрите на конфигурацию Apache Commons. Эта библиотека поддерживает динамическую перезагрузку (например) файлов свойств. См.здесь.


лучший способ наблюдать, если некоторые изменения файла IMHO, чтобы сделать хэш-значение с sha1 или mda5 и сохранить значение в кэше. И Вы делаете поток, который каждые минуты, секунды зависит от того, как часто вы смотрите изменения файла, и делаете хэш-значение над файлом. Таким образом, вы можете сравнить эти два значения, и если значения не эквивалентны, вы можете перезагрузить новый файл.