[RESOLVIDO] Chamar classe dinamicamente

Olá pessoal.

Eu preciso chamar várias classes que só diferenciam num digito (classe_1, classe_2). Pesei em fazer isso atraves de um for.

Pelo que li posso usar o Class (Class.forName(“classe_1”)). Porém está dando um java.lang.ClassNotFoundException.

Segue parte do código:

 for(int x=1; x<=nmut; x++) {
        	try {
        		Class classe = Class.forName("classe_"+x);
                        Method metodo;
        		metodo = classe.getDeclaredMethod("metodo");

Alguém poderia me ajuda?

Ps: As classes estão em outro pacote, mas para teste copiei algumas para o mesmo pacote e não estão dando certo. Uso o JDK 6.

Mesmo estando em outro pacote ou não, Class.forName espera o nome completo com o package e tudo.

E as classes não devem estar no default package.

Opa, valeu por ter respondido. Mas continuo sem conseguir. Poderia dar um exemplo do nome completo do arquivo? Uso o Netbeans e estão no package Teste.

Horas…

Se sua classe esta coma declaração “sistema.teste” e o nome da classe é Pessoa.

Voce faz o seguinte:

Class.forName("sistema.teste.Pessoa");

Opa, valeu mais uma vez cara.

Consegui resolver do jeito que falou.

Agora tenho outra dúvida, estou tentando acessar um método dessa classe e não consigo. Procurei em vários tópicos e já tentei todas formas.

Class classe = Class.forName("Classe_"+x);
Method metodo = classe.getMethod("calc",int.class,int.class,int.class);
result = (Double) metodo.invoke(classe, n1,n2,n3);

Como pode observar eu tenho que passar 3 variáveis inteiras para o método. Porém ele acusa que a classe não foi instanciada:
java.lang.IllegalArgumentException: object is not an instance of declaring class

Poderia me ajudar em mais essa? Valeu.

A classe não é uma instancia, para executar algum metodo de uma classe vc precisa de uma instancia dela a menos que o metodo seja estatico.

no seu exemplo no metodo invoke você está passando a propria classe, você tem que instanciar ela.

Class classe = Class.forName("Classe_"+x);
Object instancia = classe.newInstance();
Method metodo = classe.getMethod("calc",int.class,int.class,int.class);
result = (Double) metodo.invoke(instancia, n1,n2,n3);//repare que aqui eu uso a instancia

PS: Para usar o newInstance sua classe deve ter um construtor sem parametros, se houver somente construtores com parametros vc vai ter que procurar esse construtor no classe.getConstrutors

Deu certo!

Obrigado ai aos dois. Valeu.

valeu pela ajuda gente, eu estava precisando disso! :slight_smile: