Como instanciar objetos dinamicamente? Determinando o tipo em tempo de execução?

5 respostas
diego_qmota

Estou lendo configurações do meu programa a partir de arquivos XML que são usados para alimentar dados em objetos (usando a classe XStream), que eu manipulo dentro do programa.

Para automatizar mais o processo e facilitar mudanças posteriores, já que vou trabalhar com muitas subclasses e muitas serão criadas posteriormente, gostaria de instanciar um objeto de uma subclasse, em uma instância de superclasse (e efetuar processamente polimórfico dela) com o nome da classe armazenado em uma String…

[size=14]Exemplificando[/size]

Tenha a superclasse Automovel. E a subclasse dela, Carro.

Gostaria de fazer a instanciação:

Automovel auto = new Carro();

…de forma dinâmica, com os dados que gravei no arquivo XML:

String nomeSubClasse = dadosXML.getSubClasse();    //método retorna string com o nome da subclasse
Automovel auto = new (nomeSubClasse) ();               //quero algo similar a isso - instanciar o objeto de superclasse com a instância correta de subclasse

Como poderia fazer isso?

5 Respostas

E
String nomeSubClasse = dadosXML.getSubClasse();
 Automovel auto = Class.forName (nomeSubClasse).newInstance(); //
sergiotaborda

Só complentando, o nome da classe tem que ser o nome completo da classe ( com o pacote) e newInstance só funciona se existir um construtor publico sem argumentos na classe.

diego_qmota

Está dando erro

Parece que newInstance está retornando um objeto Object e estou tentando atribuir ele à Classe “Automovel”. E essa operação dá erro.

diego_qmota

Pessoal, eu consegui. Mas dessa forma só:

String nomeSubClasse = dadosXML.getSubClasse();   
Automovel auto = (Automovel) Class.forName (nomeSubClasse).newInstance(); //

Ele não aceita na referência auto o retorno de newInstance(), que é um Object. Não sei se há outra forma, mas também não têm problema, já que posso fazer um cast depois, dessa forma:

auto.getClass().cast(auto);
sergiotaborda

diego_qmota:
Pessoal, eu consegui. Mas dessa forma só:

String nomeSubClasse = dadosXML.getSubClasse();   
Automovel auto = (Automovel) Class.forName (nomeSubClasse).newInstance(); //

Ele não aceita na referência auto o retorno de newInstance(), que é um Object. Não sei se há outra forma, mas também não têm problema, já que posso fazer um cast depois, dessa forma:

O codigo acima está certo. outra opção é

String nomeSubClasse = dadosXML.getSubClasse();   
Automovel auto = Automovel.class.cast( Class.forName (nomeSubClasse).newInstance()); //
Criado 19 de outubro de 2009
Ultima resposta 19 de out. de 2009
Respostas 5
Participantes 3