Reflection + Generic + Class

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!

Impossivel do modo que voce ta falando.

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

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!

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

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/

Isso… era aquilo que eu queria lembrar.

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!