2010-02-24 10 views
7

Estoy usando IntelliJ IDEA 8 para depurar algunos Java, pero esta pregunta probablemente podría aplicarse a todos los depuradores de Java. En la lista de variables, que se muestran como:Descifrar información variable al depurar Java

myVariable = {} [email protected]

Tengo curiosidad por el número que viene después del nombre de la clase. ¿Cuál es el número exactamente? ¿Dos variables tendrán el mismo número si es el mismo objeto subyacente al que se hace referencia?

Gracias de antemano.

Respuesta

10

Eso es objectId reportado por la JVM, para obtener más detalles, consulte el JDWP specification.

Identifica de forma exclusiva un objeto en la máquina virtual de destino . Un objeto particular será identificado exactamente por un ID de objeto en Comandos JDWP y responde a lo largo de su duración (o hasta que objectID sea explícitamente eliminado). Un ObjectID es no reutilizado para identificar un objeto diferente a menos que haya sido explícitamente eliminado , independientemente de si el objeto referenciado ha sido basura recopilada. Un objectID de 0 representa un objeto nulo. Tenga en cuenta que la existencia de un ID de objeto no impide la recolección de basura del objeto. Cualquier intento de para acceder a un objeto recogido con su ID de objeto dará como resultado el código de error INVALID_OBJECT . La recolección de basura puede ser deshabilitada con el comando DisableCollection , pero generalmente no es necesario para hacerlo.

+0

El objectID de JDWP es algo inútil, porque no tenemos acceso a él desde nuestro código. El System.identityCashCode() del objeto sería mucho más útil. Esto se debe a que con frecuencia tenemos un objeto A que contiene una referencia a un objeto B, y en toString() del objeto A podemos incluir el código de identidad del objeto B, pero luego examinamos las variables/relojes/etc. el objeto B con ese código hash de identidad y no podemos encontrarlo, porque IntelliJ IDEA no lo está informando mediante hashcode de identidad. –

+0

Lo mismo se aplica al registro: con frecuencia registramos referencias a objetos; Una manera fácil y confiable de registrar una instancia de un objeto es registrar su identityHashCode. Pero una vez más, IntelliJ IDEA hace imposible verificar si un objeto cuya referencia está en el registro es igual que una referencia que aparece en las variables, porque solo puedo registrar un identityHashCode, pero IntelliJ IDEA muestra los ID de objeto JDWP. –

-3

Parece que es solo un resultado directo de String generado cuando una clase no reemplaza a String con su propia implementación.

Si ese es el caso (que se puede comprobar anulando toString y ver si le da una salida diferente), entonces, de acuerdo a la documentación de Java para objetos (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html) la aplicación por defecto para toString es:

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

Hashcodes: cuál es el número al que te refieres, es bastante complicado. Una vez más, desde la documentación de Java en el objeto, código hash se implementa con el siguiente contrato:

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. 

Así, respuesta corta, que el número no significa que es la misma referencia de objeto. Pueden tener los mismos valores almacenados, pero incluso eso no es un hecho.

+0

Me temo que esta respuesta no es correcta, no es un código hash. – CrazyCoder

+0

Sí, me expulsaron (como dije) parecía la implementación predeterminada de String para mí. – MCory

Cuestiones relacionadas