Как получить адрес объекта Java?[дубликат]
-
20-09-2019 - |
Вопрос
На этот вопрос уже есть ответ здесь:
Есть ли способ получить адрес объекта 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);
}
});
Если обновленный статус изменится, я обновлю таблицу.Класс MyString имеет частную строку «Значение».Я хочу прослушать файл свойств.Таким образом, он должен сделать updateStatus.value и строку файла свойств равными по одному и тому же адресу.Если я смогу это сделать, мне не нужно будет прослушивать файл свойств.
updatedStatus.setValue(resourceMap.getString("HDI.Device.1.Name"));
Я пытался использовать StringBuffer, но не смог этого добиться.Вот почему я задал вопрос.
Решение
Во-первых — нет, в Java нельзя получить адрес объекта;по крайней мере, не чистая Java без агента отладки и т. д.Во-первых, адрес может меняться со временем.Вам это не нужно.
Во-вторых, немного сложно уловить ваше объяснение, но вы, конечно, не будет иметь возможность уйти, не прослушивая изменения в самом файле.После того, как вы загрузили файл в Properties
объект, любые последующие изменения файла на диске не будет быть видимым в этом объекте, если вы специально не перезагрузите его.
По сути, вам следует прослушивать изменения в файле (или опрашивать его) и перезагрузить файл (либо в новый Properties
или перезаписать существующий) в этот момент.Совсем ли ты также необходимость прослушивания обновлений в строковом контейнере будет зависеть от вашего приложения.
Другие советы
мы можем получить адрес объекта в памяти.Ну как?это так;
используя класс sun.misc.Unsafe в Java.
создайте новый объект Unsafe и используйте getAddress(Object)
;метод, и он вернет длинное значение, которое является адресом.
а также существует множество методов для этого класса.
вы можете изменить значения в этом адресе, используя putInt(Object,long offset, int value)
или как этот метод. (получение некоторого значения getnt(Object)
).
Примечание:этот класс действительно НЕБЕЗОПАСНО .если вы делаете неправильные вещи в своем проекте, JVM будет остановлен.
System.identityHashCode(obj)
обеспечивает следующую лучшую вещь:уникальный номер для каждого объекта.Это соответствует значению по умолчанию Object.hashCode()
выполнение.
Процитируем API:«Насколько это разумно практично, метод hashCode, определенный классом Object, действительно возвращает разные целые числа для разных объектов.(Обычно это реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализации не требуется языком программирования JavaTM.)».
Посмотрите конфигурацию Apache Commons.Эта библиотека поддерживает динамическую перезагрузку (например) файлов свойств.Видеть здесь.
Лучший способ наблюдать за изменениями в файле - это, ИМХО, создать хеш-значение с помощью sha1 или mda5 и сохранить это значение в кеше.И вы создаете поток, который каждые минуты, секунды зависит от того, как часто вы наблюдаете за изменениями файла, и создаете хэш-значение для файла.Таким образом, вы можете сравнить эти два значения и, если значения не эквивалентны, вы можете перезагрузить новый файл.
Java не похожа на C/C++.в C++ вы часто будете работать с адресом (у этого программиста C++ есть указатель вызова концепции).Но, боюсь, это не на Java.Java очень безопасен и не позволяет вам прикасаться к его адресу.
Но есть и другие способы, которые могут быть такими же, как и ваша идея, — использовать HashCode.Хэш-код объекта основан на его адресе в HEAP.