Acessar um atributo private via reflection

6 respostas
evertonsilvagomesjav

Bom dia, pessoal tem como acessar um objeto private via reflection?

To tentando fazer assim por este caminho:

Class<RegistroBB> clas = RegistroBB.class;
						
				Field registroBean = clas.getDeclaredField("registroBean");
				
				registroBean.setAccessible(true);

Ai queria utilizar o registroBean, tipo registroBean.getNrAno(). Tem como?

6 Respostas

jzaires

Dá uma olhada nesse link: http://tutorials.jenkov.com/java-reflection/index.html.
Se não me lembro tem sobre isso que você quer.

josemanzoli

Com esse método você consegue retornar o método de qualquer objeto com qualquer método.

Passa o Object que pode ser a RegistroBB e você tem que passar os métodos que quer acessar.

O referencias é um array simples com os métodos.

Exemplo:

String objeto = "RegistroBB.getgetNrAno";
String[] referencias = objeto.split(Pattern.quote("."));

public Object retornaObjetoReferencia(Object source, String[] referencias){
        try {
            for (int i = 0; i < referencias.length - 1; i++) {
                String metodo = referencias[i];
                Method m = Class.forName(source.getClass().getName()).getMethod(metodo);
                source = m.invoke(source);
            }
            return source;
        } catch (Exception e) {
            return null;
        }
    }
evertonsilvagomesjav
josemanzoli:
Com esse método você consegue retornar o método de qualquer objeto com qualquer método.

Passa o Object que pode ser a RegistroBB e você tem que passar os métodos que quer acessar.

O referencias é um array simples com os métodos.

Exemplo:

String objeto = "RegistroBB.getgetNrAno";
String[] referencias = objeto.split(Pattern.quote("."));

public Object retornaObjetoReferencia(Object source, String[] referencias){
        try {
            for (int i = 0; i < referencias.length - 1; i++) {
                String metodo = referencias[i];
                Method m = Class.forName(source.getClass().getName()).getMethod(metodo);
                source = m.invoke(source);
            }
            return source;
        } catch (Exception e) {
            return null;
        }
    }

O problema é que eu preciso da mesma referencia do meu objeto Registro que esta dentro de RegistroBB, entendeu?

Na minha classe RegistroBB eu tenho um objeto do tipo Registro.

Eu prciso dessa referencia do objeto Registro, nao posso dar um outro new RegistroBB() pra pegar esse objeto.

josemanzoli

Ops … falha minha…

Para chamar os métodos com parâmetros use assim:

e = objeto passado por parâmetro
parametros = array simples com os parametros

Class<?> classe = Class.forName(e.getClass().getName());
Class<?>[] parametros = //insira seus parâmetros aqui
Method metodo = classe.getMethod("getValue", parametros);
Object objeto = (Object) metodo.invoke(e, (Object[]) parametros);
Eric_Yuzo

Em getMethod tudo bem, mas o invoke recebe referências as instâncias dos parâmetros e não referências a objetos “Class<?>”.

WellingtonRamos
evertonsilvagomesjava:
Bom dia, pessoal tem como acessar um objeto private via reflection? To tentando fazer assim por este caminho:
Class<RegistroBB> clas = RegistroBB.class;
						
				Field registroBean = clas.getDeclaredField("registroBean");
				
				registroBean.setAccessible(true);
Ai queria utilizar o registroBean, tipo registroBean.getNrAno(). Tem como?
O que vc fez foi apenas obter um objeto contendo o descritor do campo. Para obter o objeto, precisará usar o método get
RegistroBB obj = new RegistroBB();
Object meuObjetoInterno = registroBean.get(obj);

O mesmo vale para métodos.
O método passado pelo josemanzoli contempla apenas métodos que não possuam parâmetros na assinatura.

Criado 19 de novembro de 2010
Ultima resposta 19 de nov. de 2010
Respostas 6
Participantes 5