Executar método tendo apenas o seu nome[Resolvido]

10 respostas
Naruffy

Olá a todos :slight_smile:

Preciso executar um método apartir do seu nome salvo em uma String

li alguns tópicos aqui no GUJ e achei umas coisas sobre Reflection, dei um pesquisada e cheguei ao seguinto código de teste

public class teste
{

  public static void main(String args[])
  {

      try
      {
        this.getClass().getMethod("imprime", null).invoke(null, null);
      }
      catch (Exception ex)
      {
        ex.printStackTrace();
      }

  }
  
  
  public void imprime()
  {
    System.out.println("Deu Certo!!!!");
  }

}

porém não consigo fazer funcionar de jeito nenhuma :roll:

Estou fazendo oque de errado?

Vlw

10 Respostas

Naruffy

Achei a respota dois minutos depois :lol:

public class teste
{

  public static void main(String args[])
  {

      try
      {
        this.getClass().getMethod("imprime", null).invoke(this, null);
      }
      catch (Exception ex)
      {
        ex.printStackTrace();
      }

  }
  
  
  public void imprime()
  {
    System.out.println("Deu Certo!!!!");
  }

}
Gustavo_Yu

Declara o Imprime como estático e chama o método normalmente.

ViniGodoy

É bom ler o javadoc dos métodos antes de usa-los. O primeiro parämetro do método invoke diz ao java "imprime" de que objeto deve ser chamado. No caso, seu métod imprime não é estático, então, você precisa de um objeto no parâmetro:

public class teste {
  public static void main(String args[])  {     
      try {   
        Object obj = new teste();
        //Vamos chamar o imprime daquele obj lá em cima.
        //Você só deve passar null se o método for estático.
        this.getClass().getMethod("imprime", null).invoke(obj, null);   
      } catch (Exception ex)  {   
        ex.printStackTrace();   
      }   
  
  }   
     
     
  public void imprime() {   
    System.out.println("Deu Certo!!!!");   
  }     
}
Naruffy

ViniGodoy:
No caso, seu métod imprime não é estático, então, você precisa de um objeto no parâmetro:

Mas eu necessáriamente tenho que criar uma nova instância do meu objeto?? não posso possar a já instanciada, como eu fiz usando o this?

Obrigado

ricoldi

Naruffy:
ViniGodoy:
No caso, seu métod imprime não é estático, então, você precisa de um objeto no parâmetro:

Mas eu necessáriamente tenho que criar uma nova instância do meu objeto?? não posso possar a já instanciada, como eu fiz usando o this?

Obrigado

Pode usar o this tranquilamente sim! o exemplo do ViniGodoy é que se o metodo é estatico você não precisa passar o objeto, por motivos obvios que metodos de classe precisam de um objeto. e tambem não é possivel passar null se for executar o metodo em outra classe que não a que possue o metodo, resumindo ali onde você passa “null” ou “this” vai o objeto que possui o metodo a ser executado, manja?

Att
Ricoldi

ViniGodoy

Sim, eu só quis reforçar que é necessário passar alguma instância.

Aliás, como vc está usando this num método estático? Isso que vc postou nem é possível! :o
O Java vai dar o erro “this cannot be used in a static context”.

Mas claro, se vc tiver um método não estático, poderá usar o this. Não é muito comum, já que geralmente usamos reflexão sobre um outro objeto, mas é possível.

Naruffy

Não sabia dessa de não poder usar this em método estático, este código eu fiz só um exemplo bobo que nem testei,
mas na minha classe original deu certo, muito obrigado a todos :stuck_out_tongue:

71C4700

Não querendo resucitar, mas
Tem como com Reflection saber qual metodo, é o retorno de certo atributo?

private String nome;
public void String getNome(){
return this.nome;
}

Ajuda ??

71C4700

Alguem ?

ViniGodoy

Não fique “upando” tópicos. Ao invés de fazer isso, reformule a sua pergunta.

Eu mesmo não entendi. Como assim “qual método é retorno”?
Um método não é retorno.

Ou você está falando do getter?
Se for, não tem. A reflexão não consegue olhar para a implementação do método.

Seria necessário marcar o atributo ou o método com uma anotação que já diga isso para as classes de reflexão, ou usar um padrão como o JavaBeans onde vc garante que os gets e sets correspondem a atributos específicos.

Aliás, se vc já abriu um tópico para isso:
http://www.guj.com.br/posts/list/97979.java

Por que postou novamente a dúvida aqui? Por lá o pessoal já até te deu as respostas!

Criado 21 de julho de 2008
Ultima resposta 26 de jul. de 2008
Respostas 10
Participantes 5