Ajuda - Chamada de método em tempo de execução (invoke)

3 respostas
C

Boa noite,

Estou usando reflexão e tentei usar invoke para executar o método getNome() de pessoa,
mas não me retorna o valor do atributo.

O resultado deveria ser:
método: getNome
retorno: …retorno de testTestarRetorno()

Mas o retorno é:preciso de ajuda com o código abaixo.
…método: getNome
…retorno: null

Alguém pode me ajudar?

Obrigado.

Celso.


package teste;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TesteInvoke {

public static String testarRetorno() {
   return "...retorno de testTestarRetorno()...";
}

public static void main(String[] args) throws IllegalAccessException, 
    IllegalArgumentException, InvocationTargetException  {
   
    Pessoa pessoa = new Pessoa();
    pessoa.setRg("M-35");preciso de ajuda com o código abaixo.
    pessoa.setNome("Maria Santiago");
    Method [] mPessoa = pessoa.getClass().getDeclaredMethods();
    for (int i = 0; i < mPessoa.length; i++) {
       if (mPessoa[i].getName().compareTo("getNome") == 0) {
          Object result = mPessoa[i].invoke(pessoa, new Object[]{});     
          System.out.println("método: " + mPessoa[i].getName());
          System.out.println("retorno: " + result);   
       }
    }
}

}

“Sou o que sou por aquilo que todos somos”.

3 Respostas

jtsato

Aquele método testTestarRetorno() dentro da classe TesteInvoke não é aplicavél.
Afinal de Contas o Reflection que você quer é em cima da classe Pessoa.
Mas você estava próximo do resultado correto.

Saida:

método: public java.lang.String teste.Pessoa.getRg()
retorno: M-35
método: public java.lang.String teste.Pessoa.getNome()
retorno: Maria Santiago

package teste;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TesteInvoke {

	public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {

		Pessoa pessoa = new Pessoa();
		pessoa.setRg("M-35");
		pessoa.setNome("Maria Santiago");

		Method[] mPessoa = pessoa.getClass().getDeclaredMethods();
		CharSequence charSequence = "get";
		for (int i = 0; i < mPessoa.length; i++) {
			if (mPessoa[i].getName().contains(charSequence)) {
				Object result = mPessoa[i].invoke(pessoa, new Object[] {});
				System.out.println("método: " + mPessoa[i]);
				System.out.println("retorno: " + result);
			}
		}
	}
}
package teste;

public class Pessoa {
	
	private String rg = null;
	private String nome = null;
	
	public String getRg() {
		return rg;
	}
	public void setRg(String rg) {
		this.rg = rg;
	}
	
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
}
fabiofalci

Voce nao precisa iterar sobre todos os metodos declarados da classe.
Usa o

getDeclaredMethod(String name, Class<?>... parameterTypes)
C

Obrigado, Jtsato e Fabio.

Celso.

Criado 8 de abril de 2008
Ultima resposta 9 de abr. de 2008
Respostas 3
Participantes 3