Je voudrais imprimer la "référence d'objet" d'un objet en Java à des fins de débogage. Ie pour s'assurer que l'objet est le même (ou différent) selon la situation.
Le problème est que la classe en question hérite d'une autre classe, qui a remplacé à la fois toString () et hashCode (), ce qui me donnerait généralement l'identifiant.
Exemple de situation: exécution d'une application multithread, où je veux (pendant le développement) vérifier si tous les threads utilisent la même instance d'un objet ressource ou non.
Réponses:
Que comptez-vous faire exactement (ce que vous voulez faire fait une différence avec ce que vous devrez appeler).
hashCode
, tel que défini dans les JavaDocs, dit:Donc, si vous utilisez
hashCode()
pour savoir s'il s'agit d'un objet unique en mémoire, ce n'est pas une bonne façon de le faire.System.identityHashCode
fait ce qui suit:Ce qui, pour ce que vous faites, ressemble à ce que vous voulez ... mais ce que vous voulez faire peut ne pas être sûr selon la façon dont la bibliothèque est implémentée.
la source
Voici comment je l'ai résolu:
la source
Double equals
==
vérifiera toujours en fonction de l'identité de l'objet, quelle que soit l'implémentation des objets de hashCode ou equals. Bien sûr, assurez-vous que les références d'objet que vous comparez sontvolatile
(dans une JVM 1.5+).Si vous devez vraiment avoir le résultat Object toString d'origine (bien que ce ne soit pas la meilleure solution pour votre exemple d'utilisation), la bibliothèque Commons Lang a une méthode ObjectUtils.identityToString (Object) qui fera ce que vous voulez. À partir du JavaDoc:
la source
Vous ne pouvez pas faire ce que vous voulez en toute sécurité car le hashCode () par défaut peut ne pas renvoyer l'adresse, et a été mentionné, plusieurs objets avec le même hashCode sont possibles. La seule façon d'accomplir ce que vous voulez est de remplacer la méthode hashCode () pour les objets en question et de garantir qu'ils fournissent tous des valeurs uniques. Si cela est faisable dans votre situation est une autre question.
Pour mémoire, j'ai rencontré plusieurs objets avec le même hashcode par défaut dans une machine virtuelle IBM s'exécutant sur un serveur WAS. Nous avions un défaut où les objets placés dans un cache distant étaient écrasés à cause de cela. Cela m'a ouvert les yeux à ce moment-là, car je supposais que le hashcode par défaut était également l'adresse mémoire des objets.
la source
Ajoutez un identifiant unique à toutes vos instances, c'est-à-dire
Extend de AbstractSomething et interroge cette propriété. Sera en sécurité dans une seule VM (en supposant qu'aucun jeu ne joue avec des chargeurs de classe pour contourner la statique).
la source
sun.misc.Unsafe
on peut simplement copier le code de la chaîne de la classe d'objet pour obtenir la référence de la chaîne
la source