Reflection + Generic + Class

6 respostas
R

Eu preciso instanciar uma classe atraves de um atributo generico… a unica maneira que eu sei é tendo o nome da classe…
mas como eu consigo o nome da classe de um atributo generico nulo?

Grato!

6 Respostas

M

Impossivel do modo que voce ta falando.

Mas tem como pegar os GenericTypes que voce passa pelo generics, só nao lembro exatamente como agora.

R

Bom… a ação que eu tenho que executar… precisa do atributo generic diferente de null…
ficou mais facil…

Atributo da class

private T subject;

Logica para instanciar.

Class<T> clazz = (Class<T>) Class.forName(subject.getClass().getName());
subject = (T) clazz.getConstructor().newInstance(new Object[0]);

Valeu!

M

Você pode também fazer assim:

public class ClasseGenerica<T> {

     private Class<T> clazz;
     private T subject;

     public ClasseGenerica() {
          this.clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
          this.subject = this.clazz.newInstance(new Object[]);
     }
}

Não testei o código acima, mas dá prá ter uma idéia de como implementar …

abraço

P

Ola, se voce so tem o T, nao tem como fazer o que voce quer. Voce precisa do class ou de uma instância (para fazer o .getClass). Isso porque no Java generics nao é reificado:
http://blog.caelum.com.br/2007/04/08/generics-inferencia-de-tipos-e-reificacao-no-java-7/

M

Isso… era aquilo que eu queria lembrar.

R

Muito obrigado pelas respostas!
Eu não tinha conhecimento to tipo erause…
Para complementar e ajudar quem assim como eu não sabia da existencia do tipo erause.

http://blog.adaptivesoftware.biz/2009/02/what-is-type-erasure-in-java.html
http://java.sun.com/docs/books/tutorial/java/generics/erasure.html

Abraço!

Criado 18 de junho de 2010
Ultima resposta 18 de jun. de 2010
Respostas 6
Participantes 4