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

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?

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();

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/

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>()?

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…

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.

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 ?

[quote=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 ?[/quote]

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