Ola pessoal, gostaria de obter ajuda de vocês. É o seguinte: eu tenho uma classe que vai pegar os campos de outra classe e por fim, vai pegar as annotations dela. eu quero apenas pegar os valores das annotations e joga-los na tela.
packageprog1;importjava.lang.reflect.*;importprog1.Information;publicclassTakeField{publicstaticvoidmain(Stringargs[]){try{Classcls=Class.forName("prog1.Teste");FieldlistaCampo[]=cls.getDeclaredFields();for(inti=0;i<listaCampo.length;i++){Fieldfld=listaCampo[i];System.out.println("nome campo = "+fld.getName());System.out.println("membro da classe = "+fld.getDeclaringClass());System.out.println("tipo = "+fld.getType());fld.getAnnotations();for(intj=0;j<fld.getAnnotations().length;i++){System.out.println(fld.getAnnotations()[i]);}}}catch(Throwablee){System.err.println(e);}}}
O meu problema está em, eu não to conseguindo fazer com que eu pegue cada valor do array fld.getAnnotations() e separa-los. e joga-los.
talvez pra pegar o valor dentro da anotação vc tenha que chamar fld.getAnnotations()[j].value()
>
E
EuclidesFilizola
Na verdade estava errado. eu já concertei. agora o problema é outro.
ae vai o código.
packageprog1;importjava.lang.annotation.Annotation;importjava.lang.reflect.*;importjava.util.ArrayList;importjava.util.List;importprog1.Information;publicclassTakeField{publicstaticvoidmain(Stringargs[]){try{Classcls=Class.forName("prog1.Teste");FieldlistaCampo[]=cls.getDeclaredFields();for(inti=0;i<listaCampo.length;i++){Fieldfld=listaCampo[i];System.out.println("nome campo = "+fld.getName());System.out.println("membro da classe = "+fld.getDeclaringClass());System.out.println("tipo = "+fld.getType());Annotationa[]=fld.getAnnotations();for(intj=0;j<a.length;j++){System.out.println(a[j]);System.out.println("##"+((Information)a[j]).idade());}}}catch(Throwablee){System.err.println(e);}}}
o problema é que … eu estou quase terminando. só tem 1 problema. eu quero transformar esse código génerico, ou seja, para qualquer que seja a annotation ou a classe … mas o problema é que. eu n sei o nome da annotation, eu n sei qual annotation . Não tem como eu carregar pela classe que vai ser carregada não ? por exemplo, nesse exemplo que eu te enviei tem a classe “prog1.Teste”. dela eu vou pegar os campos da ou das annotation que tiver referenciando ela (a classe Teste) através da declaração Annotation a[] = fld.getAnnotations(); . mas essa declaração ela pega um array de annotations. oq e quero é a classe da annotations, que nesse caso, ela está separada. a annotation Information não está dentro da classe Teste. Ela está separada na classe Information que foi criada apenas para fazer a annotation. Entendeu ?
V
victorwss
Toda annotation é uma interface e tem alguns métodos (que são os campos da annotation).
Ah, e aí vai outra dica: Use o enhanced-for quando possível, pois você tem menos dor-de-cabeça com contadores e Iterators e um código mais limpo e menos sujeito a bugs.
E
EuclidesFilizola
e quanto a criação das instâncias ? … do tipo. Class.newInstance(); … eu não sei pra que realmente serve… e como usa-lo … alguem ae pra da força ?
V
victorwss
Eu pessoalmente não acho bom usar Class.newIntance(). Primeiro que ele é limitado ao construtor sem parâmetros, mas isso é o de menos. O pior problema é que ele não lança InvocationTargetException, ele lança a exceção do construtor (mesmo se for verificada) diretamente, e o compilador não vai deixar você usar catch!
Você pode usar algo do tipo:
publicclassMinhaClasse{publicMinhaClasse(){/* blablabla */}publicMinhaClasse(inta){/* blablabla */}publicMinhaClasse(Stringx,Stringy){/* blablabla */}}// Em algum outro lugar no código:// construtor 1.Constructorc1=MinhaClasse.class.getConstructor();// construtor 2.Constructorc2=MinhaClasse.class.getConstructor(int.class);// construtor 3.Constructorc3=MinhaClasse.class.getConstructor(String.class,String.class);// Instancia MinhaClasse usando o primeiro construtor.MinhaClassem1=c1.newInstance();// Instancia MinhaClasse usando o segundo construtor.MinhaClassem2=c2.newInstance(5);// Instancia MinhaClasse usando o terceiro construtor.MinhaClassem3=c3.newInstance("abc","xyz");