Como faço para invocar um método de uma classe nomeada dinamicamente?

Olá pessoal, pensei, pensei e nao me saiu um nome melhor p/ o tópico, mas espero que com a exlicação fique mais claro! :slight_smile:

Bem… preciso montar um filtro dinâmico na aplicação que estou construindo (é uma aplicação Desktop) e para isso pego o nome da tabela (retirado de uma query) e o armazeno em uma variável, que é tratada e recebe o nome da classe respectiva à tabela.

Todas estas classes referentes às tabelas apresentarão um método chamado “respectivo”.

Desta forma faço o seguinte:

itens[i] = nomeTabela.respectivo((queryBuilder.getSelectColuna(i)).toString());

mas isso não é aceito, pois a variável “nomeTabela” não é uma classe e sim uma String. Minha dúvida resumidamente é: como faço para essa String “nomeTabela” virar uma classe e assim poder invocar o método respectivo desta?

Valeu!!

Vc pode instanciar uma classe com ClassLoader e ler seus métodos com Method.invoke.

Leia sobre Method (http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html) e sobre Reflection (http://java.sun.com/javase/6/docs/technotes/guides/reflection/index.html)

A palavra-chave é: REFLECTION!

Como o colega já te deu a dica na msg acima.

Dá uma olhada no tutorial do java, no tópico “Reflection”.

[]'s, :wink:

Ah, desculpe, esqueci de avisar, mas toma cuidado com o Reflection, é algo MUITO legal, eu acho show de bola, gosto de usar, só que ele faz com q seu sistema perca muita performace. Então, cuidado, dose bem o uso que vc vai fazer disso ai.

T+

fala Alcides, blza cara?

Não se se já chegou a dar uma olhada nisso aqui.
Loading Classes Dynamically from within Extensions

Você tem o nome completo da classe quando você tá tentado instancia-la?

Vale olhar aqui também
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Class.html

[]´s

Valeu pessoal, valeu Rodrigo, com suas dicas cheguei nesse tutorial aqui:
http://www.guj.com.br/java.tutorial.artigo.10.1.guj
E me ajudou bastante… quanto ao desempenho, realmente é um fator preocupante mesmo, vou ter que fazer alguns testes!

Bem Rodrigo, as classes estao todas em um mesmo pacote e todas possuem o método “respectivo”, entao acabou ficando assim meu código:

alias = queryBuilder.getSelectAlias(i); nomeTabela = queryBuilder.getFrom(alias); nomeTabela = StringUtils.ajustaTabela(nomeTabela); Class cls = Class.forName("br.com.empresa.core.table."+nomeTabela); Method meth = cls.getMethod("respectivo", String.class); Object retobj = meth.invoke(cls.newInstance(),(queryBuilder.getSelectColuna(i)).toString()); itens[i] = retobj.toString(); tabs[i] = new FiltroTabBusca(retobj.toString());

Não funcionou ainda pois estas classes são na verdade enums, mas estou modificando-as p/ ver se da certo:

public enum Agencia {

para

public class Agencia{, esta com o enum interno.

Valeu todo o apoio ai pessoal!! Brigadão ai Rodrigo, e a certificação sai qdo? :slight_smile:
Assim que funcionar (ou não) com estas alterações que estou fazendo mando pra cá! :slight_smile:

EDITADO
Motivo: Repetição

EDITADO
Motivo: Repetição