Java annotation

2,045 views

Published on

Apresentando conceitos de Annotations em Java

Published in: Technology
2 Comments
5 Likes
Statistics
Notes
No Downloads
Views
Total views
2,045
On SlideShare
0
From Embeds
0
Number of Embeds
109
Actions
Shares
0
Downloads
64
Comments
2
Likes
5
Embeds 0
No embeds

No notes for slide

Java annotation

  1. 1. @ AnnotationsNatanael FonsecaArquiteto de Software
  2. 2. ConceitoAdicionam “metadados” que não interferemdiretamente no código anotado, mas quepodem ser utilizadas posteriormente paraobter informações relevantes.Exemplo: • @Override • @SuppressWarnings
  3. 3. Diferentes usos• Fornecer informações para o compilador: Anotações podem ser utilizadas pelo compilador para detectar errors ou suprimir warnings.• Compiler-time and deployment-time processing Alguns “Software tools” podem processar anotações para gerar código, gerar XML, realizar validações em campos e etc.• Processamento em Runtime Algumas anotações estão disponíveis para serem processadas em Runtime.
  4. 4. Usadas pelo Compilador• @Deprecated Indica que o elemento marcado está "depreciado" e não deveria mais ser utilizado. O compilador gera um "warning" quando você utiliza um método que possui esta anotação.• @Override Informa ao compilador que o elemento está sobrescrevendo um outros elemento declarado na superclasse.• @SuppressWarnings Diz ao compilador para suprimir especificos "warnings" que poderiam ser gerados.
  5. 5. Criando suas próprias anotaçõesSegue a mesma regra de criação de umainterface, mas coloca-se simbolo “@” antes dapalavra chave “interface”. Ex: public @interface MyAnnotation { }
  6. 6. Algumas Regras• A declaração dos métodos não deveriam ter quaisquer parâmetros, não deveriam lançar quaisquer exceções e o tipo de retorno deve ser um dos seguintes: – Primitivos; – String; – Class; – Enum; – Array de um dos tipos acima.
  7. 7. Meta-AnnotationConhecidas como Anotação de anotação eservem para definir o comportamento daanotação sendo criada, são elas: – Target – Retention – Documented – Inherited
  8. 8. @TargetIndica em qual elemento da classe a anotação pode ser aplicada:• @Target(ElementType.TYPE) - Pode ser aplicado a qualquer elemento da classe;• @Target(ElementType.FIELD) - Pode ser aplicado a um campo ou propriedade;• @Target(ElementType.METHOD)- Pode ser aplicado a um método;• @Target(ElementType.PARAMETER) - Pode ser aplicado a parâmetros de um método;• @Target(ElementType.CONSTRUCTOR) - Pode ser aplicado a contrutores;• @Target(ElementType.LOCAL_VARIABLE) - Pode ser aplicado a variáveis locais;• @Target(ElementType.ANNOTATION_TYPE) - Indica que o próprio tipo declarado é um anotação de anotação;
  9. 9. @RetentionIndica onde e quanto tempo as anotações destetipo serão obtidas, pode possuir três valores :• RetentionPolicy.SOURCE – Serão obtidas somente em nível de fonte e serão ignoradas pelo compilador;• RetentionPolicy.CLASS—Serão obtidas apenas em nível de compilação pelo compilador e serão ignoradas pela VM;• RetentionPolicy.RUNTIME— Obtidas pela VM e Serão lidas apenas em runtime;
  10. 10. @Documented e @Inherited@Documented: Indica se a anotação pertencerá aojavadoc ou algum outro gerador de documentaçãopor padrão;@Inherited: Indica se a anotação será herdadapelas subclasses automaticamente, sendo assim,Caso haja uma consulta procurando por umaanotação qualquer, se a classe consultada nãopossuir a anotação a classe pai será consultada porpadrão.
  11. 11. Exemplo @MyAnnotation em nível de Classe@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface MyAnnotation { public String name(); public String value();}
  12. 12. Exemplo @MyAnnotation em nível de classe@MyAnnotation(name="Natanael Fonseca", value="Qualquer coisa")public class Pessoa { private String nome; private String telefone; public Pessoa() { }}
  13. 13. Como processar @MyAnnotation em nível de classepublic static void main(String[] args) { Class aClass = Pessoa.class; Annotation[] annotations = aClass.getAnnotations(); for (Annotation annotation : annotations) { if (annotation instanceof MyAnnotation) { MyAnnotation myAnnotation = (MyAnnotation) annotation; System.out.println("name: " + myAnnotation.name()); System.out.println("value: " + myAnnotation.value()); } } }
  14. 14. Exemplo @MyAnnotation em nível de campo@Retention(RetentionPolicy.RUNTIME)@Target(ElementType. FIELD)public @interface MyAnnotation { public String name(); public String value();}
  15. 15. Exemplo @MyAnnotation em nível de campopublic class Pessoa { @MyAnnotation(name="Natanael Fonseca", value="Qualquer coisa") public String nome; private String telefone;}
  16. 16. Como Processar @MyAnnotation em nível de Campopublic static void main(String[] args) {Class aClass = Pessoa.class; Field[] fields = aClass.getFields(); Obtém os campos públicos da classe, Sendo assim, somente campos públicos System.out.print(" Field" + fields.length ); Serão lidos desta forma. for (Field field : fields) { System.out.print(" Field" + field.getName() ); Annotation[] annotations = field.getDeclaredAnnotations(); for (Annotation annotation : annotations) { if (annotation instanceof MyAnnotation) { MyAnnotation myAnnotation = (MyAnnotation) annotation; System.out.println("name: " + myAnnotation.name()); System.out.println("value: " + myAnnotation.value()); } } }}
  17. 17. Exemplo @MyAnnotation em nível de método@Retention(RetentionPolicy.RUNTIME)@Target(ElementType. METHOD)public @interface MyAnnotation { public String name(); public String value();}
  18. 18. Exemplo @MyAnnotation em nível de métodopublic class Pessoa { @MyAnnotation(name="Natanael Fonseca", value="Qualquer coisa") public void exibirMsg(){ }}
  19. 19. Como Processar @MyAnnotation em nível de métodopublic static void main(String[] args) {Class aClass = Pessoa.class; Method[] metodos = aClass.getMethods(); Obtém os métodos públicos da classe for (Method method : metodos) { Annotation[] annotations = method.getDeclaredAnnotations(); for (Annotation annotation : annotations) { if (annotation instanceof MyAnnotation) { MyAnnotation myAnnotation = (MyAnnotation) annotation; System.out.println("name: " + myAnnotation.name()); System.out.println("value: " + myAnnotation.value()); } } }}
  20. 20. Exemplo @MyAnnotation em nível de parâmetro@Retention(RetentionPolicy.RUNTIME)@Target(ElementType. PARAMETER)public @interface MyAnnotation { public String name(); public String value();}
  21. 21. Exemplo @MyAnnotation em nível de parâmetropublic class Pessoa { public String exibirPessoaConcatenandoCom( @MyAnnotation(name="Ola", value="Beleza") String palavra ){ return ""; }}
  22. 22. Como Processar @MyAnnotation em nível de parâmetropublic static void main(String[] args) {Class aClass = Pessoa.class; Method[] methods = aClass.getMethods(); De cada método, obtém as anotações for (Method method : methods) { aplicadas Annotation[][] parameterAnnotations = method.getParameterAnnotations(); Class[] parameterTypes = method.getParameterTypes(); int i = 0; for (Annotation[] annotations : parameterAnnotations) { Class parameterType = parameterTypes[i++]; for (Annotation annotation : annotations) { if (annotation instanceof MyAnnotation) { MyAnnotation myAnnotation = (MyAnnotation) annotation; System.out.println("param: " + parameterType.getName()); System.out.println("name : " + myAnnotation.name()); System.out.println("value: " + myAnnotation.value()); } } } }}

×