Ich möchte die "Objektreferenz" eines Objekts in Java zu Debugging-Zwecken drucken. Das heißt, um sicherzustellen, dass das Objekt je nach Situation gleich (oder unterschiedlich) ist.
Das Problem ist, dass die betreffende Klasse von einer anderen Klasse erbt, die sowohl toString () als auch hashCode () überschrieben hat, was mir normalerweise die ID geben würde.
Beispielsituation: Ausführen einer Multithread-Anwendung, bei der ich (während der Entwicklung) überprüfen möchte, ob alle Threads dieselbe Instanz eines Ressourcenobjekts verwenden oder nicht.
Antworten:
Was genau planen Sie damit zu tun (was Sie tun möchten, macht einen Unterschied zu dem, was Sie anrufen müssen).
hashCode
, wie in den JavaDocs definiert, sagt:Wenn Sie also
hashCode()
herausfinden möchten, ob es sich um ein eindeutiges Objekt im Speicher handelt, ist dies kein guter Weg, dies zu tun.System.identityHashCode
macht folgendes:Was für das, was Sie tun, nach dem klingt, was Sie wollen ... aber was Sie tun möchten, ist möglicherweise nicht sicher, je nachdem, wie die Bibliothek implementiert ist.
quelle
So habe ich es gelöst:
quelle
Double Equals
==
wird immer basierend auf der Objektidentität überprüft, unabhängig von der Implementierung von hashCode oder equals durch die Objekte. Natürlich - stellen Sie sicher, dass die Objektreferenzen, die Sie vergleichen, sindvolatile
(in einer JVM von 1,5+) sind.Wenn Sie wirklich das ursprüngliche Object toString-Ergebnis haben müssen (obwohl dies nicht die beste Lösung für Ihren Beispielanwendungsfall ist), verfügt die Commons Lang-Bibliothek über eine Methode ObjectUtils.identityToString (Object) , die das tut, was Sie wollen. Aus dem JavaDoc:
quelle
Sie können nicht sicher tun, was Sie wollen, da der Standard-HashCode () möglicherweise nicht die Adresse zurückgibt und bereits erwähnt wurde, dass mehrere Objekte mit demselben HashCode möglich sind. Die einzige Möglichkeit, das zu erreichen, was Sie möchten, besteht darin, die hashCode () -Methode für die betreffenden Objekte tatsächlich zu überschreiben und sicherzustellen, dass alle eindeutige Werte bereitstellen. Ob dies in Ihrer Situation machbar ist, ist eine andere Frage.
Für den Datensatz habe ich mehrere Objekte mit demselben Standard-Hashcode in einer IBM VM erlebt, die auf einem WAS-Server ausgeführt wird. Wir hatten einen Fehler, bei dem Objekte, die in einen Remote-Cache gestellt wurden, aus diesem Grund überschrieben wurden. Das war zu diesem Zeitpunkt ein Augenöffner für mich, da ich davon ausging, dass der Standard-Hashcode auch die Speicheradresse des Objekts war.
quelle
Fügen Sie allen Ihren Instanzen eine eindeutige ID hinzu, z
Erweitern Sie von AbstractSomething und fragen Sie diese Eigenschaft ab. Wird in einem einzigen VM sicher sein (vorausgesetzt, es wird kein Spiel mit Klassenladern gespielt, um die Statik zu umgehen).
quelle
sun.misc.Unsafe
Wir können einfach den Code von der Zeichenfolge der Objektklasse kopieren, um die Referenz der Zeichenfolge zu erhalten
quelle