Olá… estou tentando implementar algo com Annotations… estava tudo certo na minha cabeça… mas quando vi… não é possivel usar Classes como parametro na Annotation… apenas primitive types, Strings e Enums.
Então o que eu queria era ter mais ou menos o seguinte.
Kra, o qi vc quer ali eh indicar qual Formatter a ser usado nao eh?
Entao, passa simplesmente um Class ali que indica a classe do Formatter.
Dai qndo vc pegar sua annotation por reflexao vc pega o class do formatter e da um newInstance nele, pronto.
Marky.Vasconcelos
Nossa. agora que eu pensei… nem teria como eu passar um objeto lá mesmo… já que vou ter um objeto estatico que é uma instancia desse formatter vou poder passar o .class.
Vou tentar… vlw.
Marcelo_FS
Sagatiba:
Kra, o qi vc quer ali eh indicar qual Formatter a ser usado nao eh?
Entao, passa simplesmente um Class ali que indica a classe do Formatter.
Dai qndo vc pegar sua annotation por reflexao vc pega o class do formatter e da um newInstance nele, pronto.
privatestaticfinalFormatterBASIC_FORMATTER=newFormatter(){//implementação};//Dai eu queria poder passar esse objeto..@Resolvable(formatter=BASIC_FORMATTER)privateStringstring;
Eu tive que deixar o .class mesmo e criei classes que implementão Formatter invés de criar essas anonymous class…
Eu não queria ter que dar um newInstance… mas como tudo que estou fazendo nesse meu projeto auxiliar é baseado em Reflection… isso não é um problema.
victorwss
Mark_Ameba:
É que eu teria mais ou menos o seguinte código:
privatestaticfinalFormatterBASIC_FORMATTER=newFormatter(){//implementação};//Dai eu queria poder passar esse objeto..@Resolvable(formatter=BASIC_FORMATTER)privateStringstring;
Eu tive que deixar o .class mesmo e criei classes que implementão Formatter invés de criar essas anonymous class..
Eu não queria ter que dar um newInstance.. mas como tudo que estou fazendo nesse meu projeto auxiliar é baseado em Reflection.. isso não é um problema.
Você pode fazer assim:
packagexxx;importjava.lang.ref.WeakReference;importjava.util.Map;importjava.util.WeakHashMap;publicclassFormatterCache{privatestaticfinalMap<Class<?extendsFormatter>,WeakReference<Formatter>>FORMATTERS=newWeakHashMap<Class<?extendsFormatter>,WeakReference<Formatter>>();/** * Construtor privado. Esta classe não é instanciável. */privateFormatterCache(){}publicsynchronizedstatic<EextendsFormatter>EgetFormatter(Class<E>classe){if(classe==null)thrownewIllegalArgumentException();@SuppressWarnings("unchecked")WeakReference<E>wr=(WeakReference<E>)FORMATTERS.get(classe);if(wr==null)returnpopular(classe);Eformat=wr.get();returnformat!=null?format:popular(classe);}privatestatic<EextendsFormatter>EgetFormatter(Class<E>classe){Eformat=classe.newInstance();// Ou então use classe.getConstructor().newInstance() caso o construtor possa lançar exceções// ou deva receber parâmetros.FORMATTERS.put(classe,newWeakReference<E>(format));returnformat;}}
Daí tudo que você tem que fazer para pegar o Formatter é chamar o método getFormatter() passando a classe que você leu da annotation. Já vai fazer cache sem atrapalhar o coletor de lixo. :)