2010-02-24 3 views
7

Sto usando IntelliJ IDEA 8 per eseguire il debug di alcuni Java, ma questa domanda potrebbe probabilmente essere applicata a tutti i debugger Java. Nell'elenco delle variabili, essi vengono visualizzati come:Decifrare le informazioni variabili durante il debug di Java

myVariable = {} [email protected]

Io sono curioso di sapere il numero che viene dopo il nome della classe. Qual è il numero esattamente? Due variabili hanno lo stesso numero se si tratta dello stesso oggetto sottostante a cui ci si riferisce?

Grazie in anticipo.

risposta

10

Questo è objectId riportato dalla JVM, per i dettagli si prega di vedere lo JDWP specification.

Identifica univocamente un oggetto nella VM di destinazione . Un oggetto particolare sarà identificato da esattamente un ID oggetto nei comandi JDWP e le risposte in tutto la sua durata (o fino a quando l'ID oggetto è esplicitamente disposto). Un ID oggetto è non riutilizzato per identificare un diverso oggetto a meno che non sia stato disposto esplicitamente , indipendentemente dal fatto che l'oggetto di riferimento sia stato immondizia raccolto. Un objectID di 0 rappresenta un oggetto nullo. Si noti che l'esistenza di di un ID oggetto non impedisce la garbage collection dell'oggetto. Qualsiasi tentativo di accedere a un oggetto raccolto immondizia con l'oggetto ID comporterà il codice di errore INVALID_OBJECT . La garbage collection può essere disabilitata con il comando DisableCollection , ma di solito non è necessario per farlo.

+0

L'ID oggetto JDWP è in qualche modo inutile, poiché non è possibile accedervi dal nostro codice. Il System.identityCashCode() dell'oggetto sarebbe molto più utile. Questo perché molto spesso abbiamo un oggetto A che contiene un riferimento a un oggetto B, e nel toString() dell'oggetto A possiamo includere l'hashcode dell'identità dell'oggetto B, ma poi guardiamo attraverso le variabili/orologi/etc per un oggetto B con quell'identità hashcode e non possiamo trovarlo, perché IntelliJ IDEA non lo sta segnalando per identità hashcode. –

+0

Lo stesso vale per la registrazione: molto spesso registriamo i riferimenti agli oggetti; un modo semplice e affidabile per registrare un'istanza di un oggetto è registrare la sua identitàHashCode. Ma ancora, IntelliJ IDEA rende impossibile verificare se un oggetto il cui riferimento è nel log è lo stesso di un riferimento che appare nelle variabili, perché posso solo accedere a un identityHashCode, ma IntelliJ IDEA mostra gli ID oggetto JDWP. –

-3

Sembra che sia solo un risultato toString diretto come generato quando una classe non esegue l'override di toString con la propria implementazione.

Se questo è il caso (che è possibile controllare l'override toString e vedere se si ottiene un output diverso), quindi in base alla documentazione Java per Object (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html) l'implementazione di default per toString è:

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

I codici hash, a quale numero si riferisce, sono piuttosto complicati. Anche in questo caso, dalla documentazione Java su oggetto, codice hash viene implementato con il seguente contratto:

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. 

Quindi, risposta breve, è il numero non significa che sia lo stesso riferimento all'oggetto. Possono avere gli stessi valori memorizzati, ma anche questo non è un dato.

+0

Ho paura che questa risposta non sia corretta, non è un codice hash. – CrazyCoder

+0

Sì, sono stato buttato fuori da quando (come ho detto) mi sembrava l'implementazione toString predefinita. – MCory