Como capturar uma anotação de um método via reflexão?

6 respostas
P

Então gente, eu estou com esse problema. Eu não consigo capturar as anotações de um método utilizando reflexão.

Eu estou fazendo assim:

Minha anotação a ser capturada:

package superPonte.anotacoes;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 *
 * @author tiagofraga
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)

public @interface ProcessaEvento
{
    String nomeEvento();
    String tipoDado();
}

E a forma que estou capturando:

..
for ( int i = 0; i < m.length; i++)
{
                PublicaEvento publicaEvento   = (PublicaEvento)m[i].getAnnotation(PublicaEvento.class);
                ProcessaEvento processaEvento = (ProcessaEvento)m[i].getAnnotation(ProcessaEvento.class);
                String nmCampo = m[i].getName();
                parametros = m[i].getParameterTypes();
                listaArgs = new Object[1];
                Method chamada = null;
}
..

No caso, m é um vetor com os métodos capturados emMethod m[] = c.getDeclaredMethods();.

E os métodos estão anotado addim:

@PublicaEvento(nomeEvento = "nomeAlbum", tipoDado = "java.lang.String")
    public String getNomeAlbum()
    {
        return nomeAlbum;
    }

Porém quando eu rodo o programa, ele ignora solenemente a anotação dos métodos.

Então, como eu faço para capturar essas anotações dos métodos, uma vez que elas são partes atuantes da minha regra de negócio?

6 Respostas

P

Ocorre algum erro?

V

http://www.guj.com.br/article.show.logic?id=136

E

Uai, deveria funcionar. Rodei o código abaixo e parece que funciona OK.

import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  
import java.lang.reflect.*;

@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.METHOD) 
@interface PublicaEvento {
    String nomeEvento();
    Class<?> tipoDado();
}

@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.METHOD) 
@interface ProcessaEvento {
    String nomeEvento();
    Class<?> tipoDado();
}

class Abacaxi {
    @PublicaEvento (nomeEvento = "Abstrato", tipoDado = Integer.class) 
    public void parisHilton() {}
    @ProcessaEvento (nomeEvento = "Concreto", tipoDado = java.text.SimpleDateFormat.class)
    public void giseleBundchen() {}
}

class Teste {
    public static void main (String[] args) {
        Object obj = new Abacaxi();
        Method[] methods = obj.getClass().getDeclaredMethods();
        for (Method m : methods) {
            System.out.printf ("Nome do metodo: %s %n", m.getName());
            PublicaEvento pev = m.getAnnotation (PublicaEvento.class);
            if (pev != null) {
                 System.out.printf ("%s -> %s %n", pev.nomeEvento(), pev.tipoDado());
            }
            ProcessaEvento prv = m.getAnnotation (ProcessaEvento.class);
            if (prv != null) {
                 System.out.printf ("%s -> %s %n", prv.nomeEvento(), prv.tipoDado());
            }
            
        }
    }
}
P

Não! Só não captura a anotação.

V

Psycopata:
Então gente, eu estou com esse problema. Eu não consigo capturar as anotações de um método utilizando reflexão.

Eu estou fazendo assim:

Minha anotação a ser capturada:

package superPonte.anotacoes;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 *
 * @author tiagofraga
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)

public @interface ProcessaEvento
{
    String nomeEvento();
    String tipoDado();
}

E a forma que estou capturando:

..
for ( int i = 0; i < m.length; i++)
{
                PublicaEvento publicaEvento   = (PublicaEvento)m[i].getAnnotation(PublicaEvento.class);
                ProcessaEvento processaEvento = (ProcessaEvento)m[i].getAnnotation(ProcessaEvento.class);
                String nmCampo = m[i].getName();
                parametros = m[i].getParameterTypes();
                listaArgs = new Object[1];
                Method chamada = null;
}
..

No caso, m é um vetor com os métodos capturados emMethod m[] = c.getDeclaredMethods();.

E os métodos estão anotado addim:

@PublicaEvento(nomeEvento = "nomeAlbum", tipoDado = "java.lang.String")
    public String getNomeAlbum()
    {
        return nomeAlbum;
    }

Porém quando eu rodo o programa, ele ignora solenemente a anotação dos métodos.

Então, como eu faço para capturar essas anotações dos métodos, uma vez que elas são partes atuantes da minha regra de negócio?

Veja que vc não esta fazendo besteira, sua classe de anotação é ProcessaEvento, e nos metodos anotados vc esta usando @PublicaEvento

P

vanzella:

Veja que vc não esta fazendo besteira, sua classe de anotação é ProcessaEvento, e nos metodos anotados vc esta usando @PublicaEvento

Hehehe, não não. O meu projet possui duas anotações mesmo. Só que julguei não ser necessário postar as duas!

Mas eu gostaria muito que fosse alguma besteira desse tipo

Criado 10 de setembro de 2009
Ultima resposta 11 de set. de 2009
Respostas 6
Participantes 4