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