Como Criar uma Java Annotation

Olá pessoal

Eu estou tentando criar uma anottaion para a realização de atividades de log na aplicação, isto é, todos os métodos que forem anotados devem realizar o log.

Para uma etapa inicial, fiz uma annotation bem simples, que possui o seguinte código:

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

	Class type();
	String method();

}

Ou seja, com esta annotation eu seto a classe a ser persistida e o nome do método que está realizando o acesso.

Para acessar a annotation eu faço o seguinte:

@Log (type=Contact.class, method="updateContact")

Agora vamos ao problema: como faço para o Java realizar uma ação nos métodos que recebem está annotation? Este conceito que eu ainda não consegui entender.

Desde já agradeço pela ajuda.

Você vai precisar fazer algo semelhante ao AspectWerkz com Annotations. Veja a documentação e entenda por que é que é tão complicado.

De qualquer maneira, lembre-se que Annotations, em seu uso comum, não modificam o funcionamento de seu programa. É só quando são usadas com alguns outros recursos (tais como Java Agents etc.) que é possível modificar o funcionamento.

Eu gostaria apenas que os métodos que receberem minha anotação executem um método logo após sua execução. Até para uma ação simples como esta o precesso de execução da anotação é complexo?

Você aconselha eu chamar o método normalmente ao invés de criar a anotação?

Eu aconselho você a aprender AOP (AspectWerkz ou AspectJ) se quiser fazer exatamente isso que você quer fazer. Você vai descobrir duas coisas:

  • O que você quer fazer já está pronto e testado;
  • É muito mais simples que parece.

Acho que neste fórum há pelo menos umas três ou quatro pessoas que são feras em AspectWerkz. Mister__M, apresente-se!

OK, vou dar uma olhada por aqui em AOP, assim que surgirem as dúvidas irei postando as mesmas aqui.

Muito obrigado thingol pela ajuda.

Olá

Achei vários links legais aqui: http://www.google.com/search?q=create+annotation+java

http://java.sun.com/j2se/1.5.0/docs/guide/apt/GettingStarted.html

http://www.oracle.com/technology/pub/articles/hunter_meta_2.html

http://today.java.net/pub/a/today/2005/07/05/IOCAnnotation.html

http://www.onjava.com/pub/a/onjava/2004/10/20/asm.html

[]s
Luca

[quote=thingol][Acho que neste fórum há pelo menos umas três ou quatro pessoas que são feras em AspectWerkz. Mister__M, apresente-se!
[/quote]

Eu! :slight_smile:

Ricardo, veja se algo nessa minha palestra sobre AOP com AspectWerkz te ajuda.

Obrigado a todos pelas repostas. Ajudou muito.
Agora mãos a obra. :stuck_out_tongue:

Só vim aqui para dizer que utilizei Spring AOP que as annotations funcionaram perfeitamente.

Não conhecia a orientação a aspectos e achei muito interessante.

Muito obrigado.

Desculpe senhores mais vc’s todos estão errados com o uso da api de reflexão é possivel verificar se
um método possui uma determinada anotação e obtê-la;

Method method = seuObjeto.getClass().getMethod(nameMethodGet,ArrayUtils.EMPTY_CLASS_ARRAY);
SuaAnnotations objAnnotations = method.getAnnotation(SuaAnnotations.class);

e verificar se objAnnotations é !=null

API de reflexão não é para menino.

Vivendo e Aprendendo.

[quote=dsrmf]Desculpe senhores mais vc’s todos estão errados com o uso da api de reflexão é possivel verificar se
um método possui uma determinada anotação e obtê-la;

Method method = seuObjeto.getClass().getMethod(nameMethodGet,ArrayUtils.EMPTY_CLASS_ARRAY);
SuaAnnotations objAnnotations = method.getAnnotation(SuaAnnotations.class);

e verificar se objAnnotations é !=null

API de reflexão não é para menino.

Vivendo e Aprendendo.[/quote]
AHUAHUAHUAHUAHUAHUAHUA

Convido o sr. a reler os posts para verificar que em nenhum momento foi dito que não era possível!

A intenção do Ricardo era disparar um método toda vez que determinados métodos dele fossem chamados, que é exatamente o que a orientação a aspectos faz através do uso dos pontos de junção, e portanto foi aconselhado que AOP é o melhor caminho!

Mas já que o sr. preferiu explicar COMO o Ricardo pode fazer do jeito desaconselhado (boas práticas de desenvolvimento pra quê, não é mesmo?), seja bem-vindo!

Vivendo e aprendendo…!

:wink:

E já que voce fez questão de upar um tópico que tava queto a 2 anos, farei questão de tranca-lo para não gerar mais discussões desse tipo.