Me gustaría imprimir la "referencia de objeto" de un objeto en Java con fines de depuración. Es decir, para asegurarse de que el objeto sea el mismo (o diferente) según la situación.
El problema es que la clase en cuestión hereda de otra clase, que ha anulado tanto toString () como hashCode () que normalmente me daría la identificación.
Situación de ejemplo: Ejecutar una aplicación de subprocesos múltiples, donde yo (durante el desarrollo) quiero verificar si todos los subprocesos usan la misma instancia de un objeto de recurso o no.
Respuestas:
¿Qué planeas hacer exactamente con él (lo que quieres hacer marca la diferencia con lo que necesitarás llamar)?
hashCode
, como se define en los JavaDocs, dice:Entonces, si está utilizando
hashCode()
para averiguar si es un objeto único en la memoria, esa no es una buena manera de hacerlo.System.identityHashCode
hace lo siguiente:Lo cual, por lo que está haciendo, suena como lo que quiere ... pero lo que quiere hacer podría no ser seguro dependiendo de cómo se implemente la biblioteca.
fuente
Así es como lo resolví:
fuente
Los dobles iguales
==
siempre comprobarán en función de la identidad del objeto, independientemente de la implementación de los objetos de hashCode o iguales. Por supuesto, asegúrese de que las referencias de objeto que está comparando esténvolatile
(en una JVM 1.5+).Si realmente debe tener el resultado original de Object toString (aunque no es la mejor solución para su caso de uso de ejemplo), la biblioteca Commons Lang tiene un método ObjectUtils.identityToString (Object) que hará lo que desee. Desde JavaDoc:
fuente
No puede hacer lo que quiere con seguridad ya que el hashCode () predeterminado puede no devolver la dirección, y se ha mencionado que son posibles varios objetos con el mismo hashCode. La única forma de lograr lo que desea es anular el método hashCode () para los objetos en cuestión y garantizar que todos proporcionen valores únicos. Si esto es factible en su situación es otra cuestión.
Para que conste, he experimentado varios objetos con el mismo código hash predeterminado en una máquina virtual IBM que se ejecuta en un servidor WAS. Tuvimos un defecto en el que los objetos que se colocaban en una caché remota se sobrescribían debido a esto. Eso fue una revelación para mí en ese momento, ya que asumí que el código hash predeterminado también era la dirección de memoria de los objetos.
fuente
Agregue una identificación única a todas sus instancias, es decir
Amplíe desde AbstractSomething y consulte esta propiedad. Estará seguro dentro de una sola máquina virtual (suponiendo que no se juegue con cargadores de clases para sortear las estáticas).
fuente
sun.misc.Unsafe
simplemente podemos copiar el código de una cadena de clase de objeto para obtener la referencia de cadena
fuente