Tem como?

7 respostas
pedroroxd

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?

7 Respostas

J

pesquisa sobre Reflection
vc pode fazer algo tipo:

Class clazz =  Class.forName("Foo");
Method bar = 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()

Dá uma lida: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

pedroroxd

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:
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");
		}

	}
}
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:

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);
pedroroxd

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:
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);
	}
}
pedroroxd

alguem? =/

Criado 22 de março de 2010
Ultima resposta 27 de mar. de 2010
Respostas 7
Participantes 3