Bom dia, pessoal tem como acessar um objeto private via reflection?
To tentando fazer assim por este caminho:
[code]Class clas = RegistroBB.class;
Field registroBean = clas.getDeclaredField("registroBean");
registroBean.setAccessible(true);[/code]
Ai queria utilizar o registroBean, tipo registroBean.getNrAno(). Tem como?
jzaires
Novembro 19, 2010, 11:44am
#2
Dá uma olhada nesse link: http://tutorials.jenkov.com/java-reflection/index.html .
Se não me lembro tem sobre isso que você quer.
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;
}
}
[quote=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:
[code]
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;
}
}
[/code][/quote]
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.
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);
Em getMethod tudo bem, mas o invoke recebe referências as instâncias dos parâmetros e não referências a objetos “Class<?>”.
[quote=evertonsilvagomesjava]Bom dia, pessoal tem como acessar um objeto private via reflection?
To tentando fazer assim por este caminho:
[code]Class clas = RegistroBB.class;
Field registroBean = clas.getDeclaredField("registroBean");
registroBean.setAccessible(true);[/code]
Ai queria utilizar o registroBean, tipo registroBean.getNrAno(). Tem como?[/quote]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.