Gostaria de imprimir a "referência de objeto" de um objeto em Java para fins de depuração. Ou seja, certificar-se de que o objeto é o mesmo (ou diferente) dependendo da situação.
O problema é que a classe em questão herda de outra classe, que sobrescreveu toString () e hashCode (), o que normalmente me forneceria o id.
Situação de exemplo: Rodando um aplicativo multi-threaded, onde eu (durante o desenvolvimento) quero verificar se todos os threads usam a mesma instância de um objeto de recurso ou não.
Respostas:
O que exatamente você está planejando fazer com ele (o que você quer fazer faz diferença no que você precisa ligar).
hashCode
, conforme definido no JavaDocs, diz:Portanto, se você está usando
hashCode()
para descobrir se é um objeto único na memória, não é uma boa maneira de fazê-lo.System.identityHashCode
faz o seguinte:O que, para o que você está fazendo, parece o que você quer ... mas o que você deseja fazer pode não ser seguro, dependendo de como a biblioteca é implementada.
fonte
Foi assim que resolvi:
fonte
O dobro de igual
==
sempre verificará com base na identidade do objeto, independentemente da implementação de hashCode ou igual dos objetos. Claro - certifique-se de que as referências de objeto que você está comparando estejamvolatile
(em uma JVM 1.5+).Se você realmente deve ter o resultado de Object toString original (embora não seja a melhor solução para seu caso de uso de exemplo), a biblioteca Commons Lang tem um método ObjectUtils.identityToString (Object) que fará o que você quiser. Do JavaDoc:
fonte
Você não pode fazer o que deseja com segurança, pois o hashCode () padrão pode não retornar o endereço e, como foi mencionado, vários objetos com o mesmo hashCode são possíveis. A única maneira de realizar o que você deseja é realmente sobrescrever o método hashCode () para os objetos em questão e garantir que todos eles forneçam valores únicos. Se isso é viável em sua situação, é outra questão.
Para registro, experimentei vários objetos com o mesmo hashcode padrão em uma IBM VM em execução em um servidor WAS. Tivemos um defeito em que os objetos colocados em um cache remoto eram sobrescritos por causa disso. Isso foi uma revelação para mim naquele ponto, já que assumi que o hashcode padrão era o endereço de memória do objeto também.
fonte
Adicione um id único a todas as suas instâncias, ou seja,
Estenda de AbstractSomething e consulte esta propriedade. Estará seguro dentro de uma única VM (assumindo que nenhum jogo com classloaders para contornar a estática).
fonte
sun.misc.Unsafe
podemos simplesmente copiar o código de tostring da classe de objeto para obter a referência de string
fonte