Tem como?

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]

alguem? =/