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.
[code] package prog1;
import java.lang.reflect.*;
import prog1.Information;
public class TakeField {
public static void main(String args[]) {
try {
Class cls = Class.forName("prog1.Teste");
Field listaCampo[] = cls.getDeclaredFields();
for (int i = 0; i < listaCampo.length; i++) {
Field fld = 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 (int j = 0; j<fld.getAnnotations().length; i++){
System.out.println(fld.getAnnotations()[i]);
}
}
}catch (Throwable e) {
System.err.println(e);
}
}
}
[/code]
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.
Na verdade estava errado. eu já concertei. agora o problema é outro.
ae vai o código.
package prog1;
import java.lang.annotation.Annotation;
import java.lang.reflect.*;
import java.util.ArrayList;
import java.util.List;
import prog1.Information;
public class TakeField {
public static void main(String args[]) {
try {
Class cls = Class.forName("prog1.Teste");
Field listaCampo[] = cls.getDeclaredFields ();
for (int i = 0; i < listaCampo.length; i++) {
Field fld = listaCampo[i];
System.out.println("nome campo = " + fld.getName());
System.out.println("membro da classe = " + fld.getDeclaringClass());
System.out.println("tipo = " + fld.getType());
Annotation a[] = fld.getAnnotations();
for (int j = 0; j< a.length; j++){
System.out.println(a[j]);
System.out.println("##"+((Information)a[j]).idade());
}
}
}catch (Throwable e) {
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 ?
Toda annotation é uma interface e tem alguns métodos (que são os campos da annotation).
Logo você pode fazer algo mais ou menos assim:
Annotation[] annotations = fld.getAnnotations();
for (Annotation a : annotations){
System.out.println(a);
for (Method m : a.getMethods()) {
Object o = m.invoke(a);
System.out.println("##" + o.toString());
}
}
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.
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:
public class MinhaClasse {
public MinhaClasse() { /* blablabla */ }
public MinhaClasse(int a) { /* blablabla */ }
public MinhaClasse(String x, String y) { /* blablabla */ }
}
// Em algum outro lugar no código:
// construtor 1.
Constructor c1 = MinhaClasse.class.getConstructor();
// construtor 2.
Constructor c2 = MinhaClasse.class.getConstructor(int.class);
// construtor 3.
Constructor c3 = MinhaClasse.class.getConstructor(String.class, String.class);
// Instancia MinhaClasse usando o primeiro construtor.
MinhaClasse m1 = c1.newInstance();
// Instancia MinhaClasse usando o segundo construtor.
MinhaClasse m2 = c2.newInstance(5);
// Instancia MinhaClasse usando o terceiro construtor.
MinhaClasse m3 = c3.newInstance("abc", "xyz");
Ou então:
// Instancia usando o construtor 1.
MinhaClasse m4 = MinhaClasse.class.newInstance();