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!
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!!
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,
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?
Assim que funcionar (ou não) com estas alterações que estou fazendo mando pra cá!
EDITADO
Motivo: Repetição
EDITADO
Motivo: Repetição