Pessoal, eu tou com várias classes, e estou fazendo na classe main para eu digitar qual classe deseja executar…
Lógico que eu poderia fazer: Digite 1 para abrir a classe X, 2 para a Y, e só if / else…
Mas eu queria saber se tem como:
Scanner scn = new Scanner(System.in);
System.out.println("Digite o nome da classe (em case sensitive) que deseja executar");
String classe = scn.next();
Ae ele faria algo do tipo : em vez de
new Teste(); // para abrir uma classe chamada teste ele faria isso:
new classe();
Tem como?
pesquisa sobre Reflection
vc pode fazer algo tipo:
Classclazz=Class.forName("Foo");Methodbar=clazz.getMethod("bar");// e assim por diante
pedroroxd
Nao intendi direito…
Como seria para executar o método main, por exemplo, de uma classe chamada Teste?
ViniGodoy
Se o main for estático, você faz assim:
Class<?> teste = Class.forName("Teste");
Method main = teste.getDeclaredMethod("main");
main.invoke(null); //Invoca o método de maneira estática. Equivalente a Teste.main()
Se for um método não estático, aí vc precisa primeiro instanciar um objeto.
Class<?> teste = Class.forName("Teste");
Object objeto = teste.newInstance(); //Chama o construtor padrão
Method metodo = teste.getDeclaredMethod("metodo");
main.invoke(objeto); //Invoca o método metodo no objeto. Equivalente a objeto.metodo()
Class<?>classeainvocar=Class.forName("TestaLista");Methodmain=classeainvocar.getDeclaredMethod("main");main.invoke(null);// Invoca o método de maneira estática.
A classe TestaLista é essa:
importjava.util.List;importbr.com.caelum.jdbc.dao.ContatoDAO;importbr.com.caelum.jdbc.modelo.Contato;publicclassTestaLista{publicstaticvoidmain(String[]args){ContatoDAOdao=newContatoDAO();List<Contato>contatos=dao.getLista();for(Contatocontato:contatos){System.out.println("Nome: "+contato.getNome());System.out.println("Email: "+contato.getEmail());System.out.println("Endereço: "+contato.getEndereco());System.out.println("Data de Nascimento: "+contato.getDataNascimento().getTime()+"\n");}}}
Ja chamei ela usando TestaLista().main, e dá certo...
Mas do outro geito nao
ViniGodoy
É que como explico no comentário, ali eu tento chamar um método estático chamado main(), sem parâmetros. Se quiser o main mesmo, tem que alterar alinha do getDeclaredMethods e do invoke:
Stringargs=newString[0];//Args que serão enviados para o main.Class<?>classeainvocar=Class.forName("TestaLista");//Solicito o método main que tenha como parâmetro um array de strings.Methodmain=classeainvocar.getDeclaredMethod("main",args.getClass());//Invocamos o método, em nenhum objeto específico (por isso o null no primeiro parâmetro),//passando o array de strings vazio como args.main.invoke(null,args);