Расшифровка информации о переменных при отладке Java

#class #intellij-idea #type-hinting

#java #отладка #intellij-идея

Вопрос:

Я использую IntelliJ IDEA 8 для отладки некоторых Java, но этот вопрос, вероятно, может быть применим ко всем отладчикам Java. В списке переменных они отображаются как:

myVariable = {some.package.SomeClass@12345}

Мне интересно узнать число, которое идет после имени класса. Какое именно число? Будут ли две переменные иметь одинаковый номер, если это один и тот же базовый объект, на который ссылаются?

Заранее спасибо.

Ответ №1:

Это идентификатор объекта, сообщаемый JVM, подробности см. В спецификации JDWP.

Однозначно идентифицирует объект в целевой виртуальной машине. Конкретный объект будет идентифицироваться только одним идентификатором объекта в командах и ответах JDWP на протяжении всего его жизненного цикла (или до тех пор, пока идентификатор объекта не будет явно удален). Идентификатор объекта не используется повторно для идентификации другого объекта, если он не был явно удален, независимо от того, был ли объект, на который ссылается, собран мусором. ObjectId, равный 0, представляет нулевой объект. Обратите внимание, что наличие идентификатора объекта не препятствует сборке мусора объекта. Любая попытка получить доступ к объекту, собранному мусором, с его идентификатором объекта приведет к появлению кода ошибки INVALID_OBJECT. Сборку мусора можно отключить с помощью команды DisableCollection, но обычно в этом нет необходимости.

Комментарии:

1. Идентификатор объекта JDWP несколько бесполезен, потому что у нас нет доступа к нему из нашего кода. System.identityCashCode() объекта был бы намного полезнее. Это потому, что довольно часто у нас есть объект A, который содержит ссылку на объект B, и в toString() объекта A мы можем включить хэш-код идентификатора объекта B, но затем мы просматриваем переменные / watches / etc для объекта B с этим хэш-кодом идентификатора, и мы не можемнайдите это, потому что IntelliJ IDEA не сообщает об этом по хэш-коду идентификатора.

2. То же самое относится и к ведению журнала: довольно часто мы регистрируем ссылки на объекты; одним из простых и надежных способов регистрации экземпляра объекта является регистрация его identityHashCode. Но опять же, IntelliJ IDEA делает невозможным проверку того, совпадает ли объект, ссылка на который находится в журнале, со ссылкой, которая отображается в переменных, потому что я могу регистрировать только identityHashCode, но IntelliJ IDEA показывает идентификаторы объектов JDWP.