Я хотел бы напечатать «ссылку на объект» объекта в Java для целей отладки. Т.е. убедиться, что объект одинаковый (или другой) в зависимости от ситуации.
Проблема в том, что рассматриваемый класс наследуется от другого класса, который переопределяет как toString (), так и hashCode (), которые обычно дают мне идентификатор.
Пример ситуации: запуск многопоточного приложения, в котором я (во время разработки) хочу проверить, все ли потоки используют один и тот же экземпляр объекта ресурса или нет.
Ответы:
Что именно вы планируете с ним делать (от того, что вы хотите сделать, зависит, что вам нужно будет позвонить).
hashCode
, как определено в JavaDocs, говорит:Поэтому, если вы используете,
hashCode()
чтобы узнать, является ли это уникальным объектом в памяти, это не лучший способ сделать это.System.identityHashCode
делает следующее:Что для того, что вы делаете, звучит как то, что вы хотите ... но то, что вы хотите сделать, может быть небезопасным в зависимости от того, как реализована библиотека.
источник
Вот как я это решил:
источник
Двойное равенство
==
всегда будет проверять на основе идентичности объекта, независимо от реализации объектами hashCode или equals. Конечно - убедитесь, что ссылки на объекты, которые вы сравниваете, соответствуютvolatile
(в 1.5+ JVM).Если вам действительно нужен исходный результат Object toString (хотя это не лучшее решение для вашего примера использования), в библиотеке Commons Lang есть метод ObjectUtils.identityToString (Object), который будет делать то, что вы хотите. Из JavaDoc:
источник
Вы не можете безопасно делать то, что хотите, поскольку по умолчанию hashCode () может не возвращать адрес, и, как уже упоминалось, возможно несколько объектов с одним и тем же hashCode. Единственный способ добиться того, что вы хотите, - это фактически переопределить метод hashCode () для рассматриваемых объектов и гарантировать, что все они предоставляют уникальные значения. Возможно ли это в вашей ситуации - другой вопрос.
Для записи я испытал несколько объектов с одним и тем же хэш-кодом по умолчанию в виртуальной машине IBM, работающей на сервере WAS. У нас был дефект, из-за которого объекты, помещаемые в удаленный кеш, перезаписывались. На тот момент это открыло мне глаза, поскольку я предположил, что хэш-код по умолчанию также является адресом памяти объектов.
источник
Добавьте уникальный идентификатор ко всем вашим экземплярам, т.е.
Расширить AbstractSomething и запросить это свойство. Будет безопасно внутри одной виртуальной машины (при условии, что нет игры с загрузчиками классов, чтобы обойти статику).
источник
sun.misc.Unsafe
мы можем просто скопировать код из строки класса объекта, чтобы получить ссылку на строку
источник