Chamar classe variável'

20 respostas
S

Salve !! To tentando fazer uma coisa meio fora do comum, não sei se tem como.

Eu quero instanciar uma classe mas não sei sei nome.
Isso mesmo!
Imagine que eu tenho 50 classes ( só imagine, eu não tenho 50 classes …), tudo no mesmo diretório da classe Principal. Aí, eu faço umas comparações, uns acessos ao bd e em tererminado momento eu preciso instanciar uma classe, cujo nome está gravado no bd.
Tem como fazer isso?

algo do tipo

variavel variavel = new variavel();

onde variavel pode ser

DesligaTudo
LigaTudo
ContagemRegressiva
Timer

Tem como fazer isso?

Obs: a idéia é o seguinte: uma empresa vende um produto e fornece extensões separadamente, cobrando ou não por isso. Não é viável reinstalar todo o sistema na casa do cliente. O método que encontrei de usar essas extensões é esse que eu citei, se for possível.

20 Respostas

victorwss

Class<?> queroInstanciar = Class.forName("br.com.meusite.meupacote.MinhaClasse"); Constructor<?> ctor = queroInstanciar.getConstructor(); Object x = ctor.newInstance(); Se essas classes que você quer instanciar são todas subclasses de uma mesma classe ou se todas implementam a mesma interface, você pode fazer isso: Class<? extends MinhaSuperclasse> queroInstanciar = Class.forName("br.com.meusite.meupacote.MinhaClasse").asSubclass(MinhaSuperclasse.class); Constructor<? extends MinhaSuperclasse> ctor = queroInstanciar.getConstructor(); MinhaSuperclasse x = ctor.newInstance(); E bem vindo ao reflection! :slight_smile:

EDIT: Arrumei o código… Desculpe aí.

S

obrigado!

eu importei o pacote java.lang.reflect.*, e diminui os erros.

Ele tá acusando que eu não posso usar um método não estático de um contexto estático. To tentando arrumar isso, obrigado pela ajuda ^^

S

eu fiz dessa forma:

public void funcao(){
        Class<?> queroInstanciar = Class.forName("Apelido");   

             Constructor<?> ctor =  Class.getConstructor();   
Object x = ctor.newInstance();  
 }

Será que estou esquecendo de algo?

S

eu fiz rodar, da seguitne forma:

try{
             Class<?> queroInstanciar = Class.forName("net.bonetechnology.Casa");   

             Constructor<?> ctor =  Class.class.getConstructor();   
Object x = ctor.newInstance(); 

             }catch(Exception e){System.out.println("o cliente não tem o arquivo");}

mas cai sempre no exception… tem idéia do que eu to fazendo de errado?

victorwss

shamanpyro:
eu fiz rodar, da seguitne forma:

try{
             Class<?> queroInstanciar = Class.forName("net.bonetechnology.Casa");   

             Constructor<?> ctor =  Class.class.getConstructor();   
Object x = ctor.newInstance(); 

             }catch(Exception e){System.out.println("o cliente não tem o arquivo");}

mas cai sempre no exception… tem idéia do que eu to fazendo de errado?

Qual exceção que dá?

S

“o cliente não tem arquivo” =P

victorwss

Ao invés de }catch(Exception e){System.out.println("o cliente não tem o arquivo");} coloca isso:}catch(Exception e){e.printStackTrace();}E agora, o que acontece?

S
java.lang.NoSuchMethodException: java.lang.Class.<init>()
        at java.lang.Class.getConstructor0(Class.java:2706)
        at java.lang.Class.getConstructor(Class.java:1657)
        at net.bonetechnology.ConverteOrdem.Converte(ConverteOrdem.java:46)
        at net.bonetechnology.Casa$1.run(Casa.java:61)
victorwss

Quais são os construtores das suas classes?

S

Eu só fiz um construtor…
a classe toda ficou assim:

package net.bonetechnology;

/**
 *
 * @author eduardoc
 */
public class DesligaTudo {
    DesligaTudo(){
    System.out.println("Funcionou!");
    }

}
T

O construtor deve ser public:

package net.bonetechnology;

/**
 *
 * @author eduardoc
 */
public class DesligaTudo {
    public DesligaTudo(){
        System.out.println("Funcionou!");
    }
}
S

putz.... tá dando o problema ainda:

public class DesligaTudo {
    public DesligaTudo(){
    System.out.println("Funcionou!");
    }

}
java.lang.NoSuchMethodException: java.lang.Class.<init>()
        at java.lang.Class.getConstructor0(Class.java:2706)
        at java.lang.Class.getConstructor(Class.java:1657)
        at net.bonetechnology.ConverteOrdem.Converte(ConverteOrdem.java:46)
        at net.bonetechnology.Casa$1.run(Casa.java:61)
victorwss
shamanpyro:
putz.... tá dando o problema ainda:
public class DesligaTudo {
    public DesligaTudo(){
    System.out.println("Funcionou!");
    }

}
java.lang.NoSuchMethodException: java.lang.Class.<init>()
        at java.lang.Class.getConstructor0(Class.java:2706)
        at java.lang.Class.getConstructor(Class.java:1657)
        at net.bonetechnology.ConverteOrdem.Converte(ConverteOrdem.java:46)
        at net.bonetechnology.Casa$1.run(Casa.java:61)

Qual é o package dela? Tem certeza que no forName você passa o nome do pacote junto com o da classe?

S

o pior é que sim:

Class<?> queroInstanciar = Class.forName("net.bonetechnology.DesligaTudo");

e no DesligaTudo:

package net.bonetechnology;
T
Class<?> queroInstanciar = Class.forName("br.com.meusite.meupacote.MinhaClasse");
Constructor<?> ctor = Class.getConstructor();
Object x = ctor.newInstance();

É óbvio que você não quer o construtor da classe Class, mas da classe referenciada por "queroInstanciar". Ou seja:

Class<?> queroInstanciar = Class.forName("br.com.meusite.meupacote.MinhaClasse");
Constructor<?> ctor = queroInstanciar.getConstructor();
Object x = ctor.newInstance();
Alexandro.Almeida

Para tudo!!

Em

Constructor<?> ctor =  Class.class.getConstructor();

Você esta pegando o construtor de java.lang.Class

Na verdade o correto é

Constructor<?> ctor =  queroInstanciar .getConstructor();
S
guardando...
 Usu/senha= LULA/13 Ordem = L2Liga
Acesso Permitido!
Lendo na porta socket
Porta está sendo usada para gravação
Funcionou!
FLUXO OK!
Enviando um byte para COM1
Enviando :

Boa… bem na minha cara e eu vacilando aqui

Obrigado a todos

victorwss

Desculpa aí, este erro teve origem no meu exemplo no segundo post de tópico. :oops:

S

haha, nada, eu deveria ter me tokado… o problema foi comigo mesmo! Obrigado pela ajuda :smiley:

S

Obrigadão pessoal!! ;))

Criado 17 de outubro de 2008
Ultima resposta 17 de out. de 2008
Respostas 20
Participantes 4