Metodo não retorna as Annotations

6 respostas
apoklypse

tenho a seguinte annotatio:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PermissaoAnnotation {

    String Objeto();
    String Acao();

}

o seguinte método:

@PermissaoAnnotation(Objeto="telaUsuario",Acao="inserir")
    public void inserirUsuario(Usuario usuario) throws RepositoryException{
        Repository dao = new Dao();
        try
        {
            dao.beginRecording();
            GerarLog.checkPermission("inserirUsuario", usuario, null, this, this.getClass());
            dao.add(usuario);
            dao.commitRecord();
        }catch(RepositoryException ex)
        {
            dao.rollbackRecord();
            throw ex;
        }
    }

O metodo checkPermission recebe a classe do método inserirUsuario e eu tento recuperar as annotations de inserirUsuario da seguinte forma

public static <T> void checkPermission(String method, Usuario usuario, Object id, Object obj, Class<T> classe) throws RepositoryException {
        Dao dao = new Dao();
        if (obj != null) {
            try {
                PermissaoAnnotation per = null;
                Method metodo = null;
                Method[] metodos = classe.getMethods();
                for (Method m : metodos) {
                    if (m.getName().equals(method)) {
                        metodo = m;
                        break;
                    }
                }
                per = metodo.getAnnotation(PermissaoAnnotation.class);
                }
                if (per != null) {
                           .....
                }
            } catch (NoSuchFieldException ex) {
                Logger.getLogger(GerarLog.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SecurityException ex) {
                throw new RepositoryException(ex);
            } catch (RepositoryException ex) {
                throw ex;
            }
        }
    }

ele encontra o método inserirUsuario por reflexão tudo certo, mas as Annotations ficam como null, ele não trás as Annotations juntos, o que mais tenho de fazer para ele reconhecer as Annotations?

6 Respostas

Marky.Vasconcelos

Só isso mesmo.

Veja se o seguinte código imprime true

System.out.println(metodo.isAnnotationPresent(PermissaoAnnotation.class));
apoklypse

Esta retornando false, agora não sei o por que, poderia ser o que exatamente que pode estar fazendo ele não reconhecer que existe a annotation.

Marky.Vasconcelos
Method[] metodos = classe.getMethods();
                for (Method m : metodos)
                  System.out.println(m.getName()+":"+m.isAnnotationPresent(PermissaoAnnotation.class));

Roda isso e verifique se em algum campo retorna true e o nome que está.

Não devia ter nada impedindo a Annotation de aparecer. Ela só não aparece quando não marca @Retention(RetentionPolicy.RUNTIME) mas voce já fez isso.

Ataxexe

Bom, algumas ideias:

  • O método inserirUsuario é a implementação de um método de assinatura genérica?

Pergunto isso porque caso seja, é bem provável que existam dois métodos inserirUsuario na classe e você esteja pegando o método bridge (que faz os casts e chama o método que você codificou) em vez do método que você deseja.

  • O parametro classe pode ser uma subclasse que sobrescreveu o metodo inserirUsuario

  • Pode existir outro método inserirUsuario (com assinatura diferente) na classe.

Te recomendo usar algum framework de reflexão pra fazer esse trabalho, Reflection na mão é um pé no saco!

apoklypse

Já descobri o problema, esta relacionado a compilação do projeto por algum motivo qualquer ele não esta gerando os .class e não atualiza o source, estou vendo o que pode ser.

Ataxexe

Eu tive um problema no eclipse porque a compatibilidade de bytecode tava marcado pra Java 1.4, aí ele não colocava as anotações.

Criado 17 de março de 2010
Ultima resposta 18 de mar. de 2010
Respostas 6
Participantes 3