Дешифровка переменной информации при отладке Java

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

myVariable = {some.package. SomeClass@12345}

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

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

13
задан Jon Onstott 24 February 2010 в 00:43
поделиться

2 ответа

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

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

14
ответ дан 2 December 2019 в 01:10
поделиться

Используйте флаг -f для rlwrap, чтобы включить завершение табуляции. Однако это будет статическое завершение, основанное на статическом списке символов в определенном файле. Если требуется динамическое завершение (на основе любого символа, который в данный момент определен в запущенном REPL), необходимо попробовать Emacs + SLIME или эквивалент.

В любом случае, это один из способов создания списка символов для заполнения табуляцией. Время от времени придется регенерировать этот файл, поскольку новые символы добавляются в ядро Clojure в каждой версии. (Этот код работает с истекающим краем clojure-contrib; clojure.contrib.io в более ранних версиях назывался утиными потоками .)

user> (use 'clojure.contrib.io)
nil
user> (with-out-writer "/home/user/.clj-tabcompletion"
        (doseq [[sym _] (ns-publics 'clojure.core)]
          (println sym)))
nil

Тогда:

$ rlwrap -f ~/.clj-tabcompletion java -jar clojure.jar
Clojure 1.2.0-master-SNAPSHOT
user=> def<TAB>
definline    defmacro     defmethod    defmulti     defn         defonce      defprotocol  defstruct    deftype
user=> def

Если терминал содержит искалеченные символы с акцентами, вероятно, возникнут проблемы с кодировкой или языковым стандартом. Это отлично работает для меня. Я не использую ОС X и не знаю, какой терминал вы используете, поэтому я не могу помочь. В Konsole в Linux, внутри rlwrap:

user=> (println "àèìòùáéíóúäëïöüâêîôûãõñ")
àèìòùáéíóúäëïöüâêîôûãõñ
nil
user=> (println "牛が牧場で草を食べている。")
牛が牧場で草を食べている。
nil
-121--4998029-

Это objectId , сообщаемый JVM, для получения более подробной информации см. спецификацию JDWP .

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

-121--2722651-

Похоже, что это просто прямой результат 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())

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

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. 

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

-3
ответ дан 2 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: