Вопрос

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

Есть ли способ получить адрес объекта 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top