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:
Class clazz = Class.forName("Foo");
Method bar = clazz.getMethod("bar");
// e assim por diante
Nao intendi direito…
Como seria para executar o método main, por exemplo, de uma classe chamada Teste?
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()
Dá uma lida: http://java.sun.com/developer/technicalArticles/ALT/Reflection/
Nao deu certo não…
Fiz os imports…
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
E colei o código:
Class<?> classeainvocar = Class.forName("TestaLista");
Method main = classeainvocar.getDeclaredMethod("main");
main.invoke(null); // Invoca o método de maneira estática.
A classe TestaLista é essa:
[code]import java.util.List;
import br.com.caelum.jdbc.dao.ContatoDAO;
import br.com.caelum.jdbc.modelo.Contato;
public class TestaLista {
public static void main(String[] args) {
ContatoDAO dao = new ContatoDAO();
List<Contato> contatos = dao.getLista();
for (Contato contato : 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");
}
}
}[/code]
Ja chamei ela usando TestaLista().main, e dá certo…
Mas do outro geito nao
É 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:
[code]String args = new String[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.
Method main = 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);[/code]
Vlw pela ajuda vini, mas ainda não ta dando…
Ele ta dando erro nessa linha:
Class<?> classeainvocar = Class.forName("TestaLista");
Erro inteiro:
Exception in thread "main" java.lang.ClassNotFoundException: TestaLista
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at br.com.caelum.jdbc.main.Main.main(Main.java:11)
Criei uma classe no mesmo pacote, só com o metodo main, mandando printar algo, e não deu certo também…
Classe inteira:
[code]import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
String[] argss = new String[0];
Class<?> classeainvocar = Class.forName("TestaLista");
Method main = classeainvocar.getDeclaredMethod("main", argss.getClass());
main.invoke(null, argss);
}
}[/code]