[RESOLVIDO] Chamar classe dinamicamente

7 respostas
L

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.

7 Respostas

M

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.

L

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.

M

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");
L

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.

F

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

L

Deu certo!

Obrigado ai aos dois. Valeu.

W

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

Criado 18 de junho de 2010
Ultima resposta 20 de jun. de 2012
Respostas 7
Participantes 4