Metodo não retorna as Annotations

tenho a seguinte annotatio:

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

String Objeto();
String Acao();

}[/code]

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?

Só isso mesmo.

Veja se o seguinte código imprime true

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

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.

 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.

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!

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.

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.