Instanciar HashMap<String, String> via reflection = Impossível?

7 respostas
saoj

Acabei de descobrir que instanciar um HashMap<String, String> usando reflection é tarefa impossível, ou seja, vc consegue fazer:

Class klass = HashMap.class;

Map m = (Map) klass.newInstance();

Mas não consegue fazer algo assim:

Class klass = HashMap&lt;String, String&gt;.class; // nem compila...

Map&lt;String, String&gt; m = (Map&lt;String, String&gt;) klass.newInstance();

Entendi errado o que foi discutido aqui (http://forum.java.sun.com/thread.jspa?threadID=5118538&tstart=120) ou é isso mesmo?

Não em como instanciar por reflection HashMap<String, String> ?

Caso afirmativo, algum workaround?

7 Respostas

Mauricio_Linhares

Não é possível instanciar tipos genéricos via reflexão porque eles simplesmente não existem em tempo de execução (nem em tempo de compilação, mas isso já é outra história…).

Você pode fazer simplesmente assim (deve dar um warning, mas nada que mate):

Map<String,String> map = hashMapClass.asSubclass(Map.class).newInstance();
Paulo_Silveira

Na verdade HashMap<String, Object> e HashMap<Abobra, Abacaxi> é a mesma coisa pro java em tempo de execucao. Ela nao consegue distinguir. No fundo, generics do java é um truque de compilacao, a nao ser pela pequena parte de reflexao que da para fazer nos atributos e classes.

Mais a respeito:
http://blog.caelum.com.br/2007/04/08/generics-inferencia-de-tipos-e-reificacao-no-java-7/

sergiolopes

Só uma pergunta, se você sabe que quer um HashMap e, mais, quer um de <String,String> porque precisa fazer com reflection? Não pode fazer o bom e velho new HashMap<String,String>()?

saoj

Porque o DAO do cara usa generics e ele quer injetar via IoC.

E IoC instancia via reflection, pois dependendo do escopo ele vai inicar isso uma ou muitas vezes.

Valeu pela ajuda pessoal! Vou ler lá o blog do Paulo…

Paulo_Silveira

entao simplesmente esqueca do generics, ele nao vai incomodar! Considere usar o picocontainer, ele ja faz essas coisas sozinho, excelente pra suar dentro de outro framework.

marcelo_bazan

Só uma dica …

se vc jah sabe que o HashMap precisa ser <String, String>, pq nao utilizar um objeto do tipo Properties via reflection do jeito que vc precisa ? Nao iria resolver o seu problema ?

Paulo_Silveira

marcelo_bazan:
Só uma dica …

se vc jah sabe que o HashMap precisa ser <String, String>, pq nao utilizar um objeto do tipo Properties via reflection do jeito que vc precisa ? Nao iria resolver o seu problema ?

Ele ainda nao sabe quais sao os tipos parametrizados. Foi so um exemplo. E properties eh mais fraca que HashMap<String,String>

Criado 15 de abril de 2007
Ultima resposta 16 de abr. de 2007
Respostas 7
Participantes 5