Saber Endereço do Objeto na Memoria

8 respostas
brlima

Bem, to querendo pegar um objeto criado e saber o endereço dele na memoria.
Porque? Pra saber em que lugar do meu programa ele tah perdendo a referencia, pois qria ter o mesmo objeto indo pra lah e pra ca. Mas em algum momente ele tah criando outro na memoria, e o que inicio a aplicação no final nao eh o mesmo.

Qual a intenção: To querendo jogar objetos dentro de uam List. Depois leio essa list, pego os objetos e jogo num JList. Depois pego o item selecionado na JList e carrego com outros valores. Qria que o mesmo objeto que estou alterando o valor fosse o mesmo que está na List. Mas não é…

Tks!

8 Respostas

maikonaraujo

É pq o JList clona a string…
Vc pode resolver este problema utilizando o padrao Observer.

brlima

Mas nao estou adicionando a String. Estou adicionando o objeto que a List retorna. E estou trabalhando com o DefaultListModel.

Tks!

T

Você pode usar algum debugger que faça isso por você (não lembro de algum gratuito que faça isso). O endereço de um objeto não é fixo, para começar; mesmo usando System.identityHashCode(), não é possível obter o endereço - a explicaçâo: quando se chama hashCode() para um objeto que não define hashCode(), ele retorna um “hash code” que está relacionado ao endereço virtual do objeto na memória no presente momento (mas não é o endereço). Só que esse hash code fica então guardado como um campo oculto desse objeto. Quando o objeto for movido de lugar na memória, o hash code retornado será o anteriormente retornado, não o novo endereço na memória.

Em vez disso, defina um campo no seu objeto que contém um “número de criação” desse objeto - é fácil, só ter um campo estático na classe que conta quantos objetos foram criados, e no construtor você incrementa esse contador, e atribui ao “número” do objeto. Algo como:

public class MinhaClasse {
     static int nObjetosCriados = 0;
     int nObjeto;
      public getNObjeto() { return nObjeto; }
     public MinhaClasse() {
         nObjetosCriados++; // talvez você tenha de usar um "synchronized" aqui...
         nObjeto = nObjetosCriados;
     }
}

Aí você fica sabendo se você não andou criando objetos em lugares esquisitos (acho é que seu programa está meio bagunçado…)

maikonaraujo

Acho q este site pode ajudar…

http://java.sun.com/developer/technicalArticles/ALT/RefObj/

maikonaraujo

Neste último site q passei tem muita coisa de como pegar a referencia em runtime

brlima

Vou dar uma olhada. Tks pessoal. Depois posto o que aconteceu…

louds

Fiquei pensando em uma coisa.
Colocar um breakpoint no construtor não resolveria isso?

kuchma

Ou entao “salve” teu objeto original em uma referencia segura (que voce nunca utiliza) e no final compare as referencias com ==. Mas a ideia do breakpoint eh boa. :smiley:

Marcio Kuchma

Criado 11 de fevereiro de 2005
Ultima resposta 12 de fev. de 2005
Respostas 8
Participantes 5