Como pegar valores de uma Annotation

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.

Ajuda ae por favor !

cara o teu for tá zoado

for (int j = 0; j&lt;fld.getAnnotations().length; j++){  
    System.out.println(fld.getAnnotations()[j]);  
}  

vc tava incrementando o i :slight_smile:

talvez pra pegar o valor dentro da anotação vc tenha que chamar fld.getAnnotations()[j].value()
>

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.

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 ?

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

Bem fiz uma rapidinha aqui…espero que ajude…ta bem simples mais é o que vc quer.

Classe principal…

public class ClasseTeste {

	public static void main(String args[]) {

		try {
			String classe = "ClasseAnnotation";
			Class cls = Class.forName(classe); // carrega
			// classe
			Object obj = cls.newInstance();
			Field listaCampo[] = cls.getDeclaredFields(); // array que pega os
			// campos

			for (Field fld : listaCampo) {
				Annotation[] annotations = fld.getAnnotations();

				for (Annotation a : annotations) {

					System.out.println("Annotation utilizada: " + a);

					for (Method m : a.annotationType().getDeclaredMethods()) {
						System.out.println("Nome do método(" + a.annotationType().getName() + "): " + m.getName());

						Object o = m.invoke(a);
						System.out.println("Valor: " + o.toString());
					}
					

				}

			}

		} catch (Throwable e) {

			System.err.println(e);

		}

	}
}

Classe de teste com annotations declaradas…

public class ClasseAnnotation {
	@Information2(endereco2 = "Endereco 1", idade2 = 0, name2 = "Carlos")
	String nomClasse = "";
	@Information(endereco = "Endereco 2", idade = 1, name = "Handerson Frota")
	int idadeClasse = 15;

}

Annotation 1

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Information {
	String name();

	int idade();

	String endereco();

}

Annotation 2

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Information2 {
	String name2();

	int idade2();

	String endereco2();
}

Abraços
www.handersonfrota.com.br
www.triadworks.com.br