Расшифровка информации о переменных при отладке Java - PullRequest
13 голосов
/ 24 февраля 2010

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

myVariable = {some.package.SomeClass@12345 enj

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

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

Ответы [ 2 ]

14 голосов
/ 24 февраля 2010

То есть objectId , сообщенное JVM, подробности см. В спецификации JDWP .

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

0 голосов
/ 24 февраля 2010

Похоже, что это просто прямой результат toString, сгенерированный, когда класс не переопределяет toString в своей собственной реализации.

Если это так (то, что вы можете проверить, переопределив toString и посмотрев, получили ли вы другой вывод), согласно документации Java для Object (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html) реализация по умолчанию для toString:

 getClass().getName() + '@' + Integer.toHexString(hashCode())

Хеш-коды - какое число вы имеете в виду - довольно хитры. Опять же, из документации Java по объекту, хеш-код реализован со следующим контрактом:

The general contract of hashCode is:

* Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.
* If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
* It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables. 

Итак, короткий ответ, вы число не означает, что это одна и та же ссылка на объект. Они могут хранить одинаковые значения, но даже это не дано.

...