Reflexão

Boa tarde,

Pessoal estou estudando reflexão e me surgiu uma duvida na parte de criação de objetos dinamicamente, quando eu tenho uma classe que herda de outra, eu recebo uma exceção, agora se eu não herda a mesma classe eu consigo criar um objeto.
Alguem sabe o que pode ser?

Exception in thread “main” java.lang.InstantiationException: modelo.Matematica
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at ReflexaoUTIL.criarObjeto(ReflexaoUTIL.java:58)


	Class<?> classe = Class.forName(nomeDaclasse);
			Object objeto = classe.newInstance();

Olá cleber_zeh,

a sua classe modelo.Matematica possui o construtor padrão (sem argumentos)? Para instanciar dessa forma (usando newInstance) é necessária a existência desse construtor e que ele esteja acessível (dá para burlar a parte de acessibilidade, mas precisa de um pouquinho mais de código).

Se a classe não possuir o construtor noargs, ou tiver N outros construtores, você pode obter os construtores e usar o método newInstance do construtor. Desta forma você pode passar os argumentos que você precisa. Digamos que sua classe (br.com.MinhaClasse, por exemplo) tenha vários construtores declarados, e você queira invocar um específico que receba uma apenas String como argumento:

MinhaClasse m;
Class clazz = Class.forName("br.com.MinhaClasse");
Constructor[] cs = clazz.getConstructors();
for (Constructor c : cs) {
    if (c.getParameterTypes()[0] == String.class) {
        m = (MinhaClasse) c.newInstance("meu argumento String");
    }
}

Obviamente, se houver outros construtores cujo 1o argumento seja uma String, você deve adequar a lógica para evitar confusão.

Edit: ops, esqueci do casting para MinhaClasse.
Edit2: Este tipo de construção também vai fazer muito mais sentido se você estiver usando polimorfismo e fizer o casting para uma superclasse… enfim, deu pra entender como funciona?

[]s
–mcbrain