São uma forma de meta-dados que proporcionam informações sobre o programa que não são parte dele em si
- Podem ser retidos em diferentes níveis:
RetentionPolicy.SOURCE
existe no código-fonte mas é descartado pelo compiladorRetentionPolicy.CLASS
existe para o compilador, mas é descartado pela JVMRetentionPolicy.RUNTIME
existe para a JVM e é utilizável em tempo de execução
- É possível definir uma lista de alvos onde a anotação pode ser utilizada:
TYPE
,TYPE_PARAMETER
,ANNOTATION_TYPE
,CONSTRUCTOR
,LOCAL_VARIABLE
,FIELD
,METHOD
,MODULE
,PACKAGE
,PARAMETER
,TYPE_USE
- Para que uma anotação apareça no java doc de uma classe, ela deve estar anotada com
@Documented

Design
- Pode conter atributos de tipos: primitivo, String, Class, Enum, Annotation ou um Array de qualquer outro tipo permitido
- Um atributo pode ter um valor padrão
- Uma anotação declarada com a anotação
@Repeatable(<container>)
pode ser usada mais de uma vez pelo container


Utilização
- Atributos são preenchidos
@Annotation(<attribute name>=<value>, <array attribute>={<value>, <value>})
- atributos com valores padrão podem ser omitidos
- se o atributo
value
for o único que precisa ser preenchido, o seu nome pode ser omitido - se o valor de um atributo array possuí apenas um valor
{ }
pode ser omitido

- Com a Java Reflection API é possível dinamicamente descobrir as anotações (retidas em runtime) de uma classe:
- recuperar o array de anotações da classe, métodos e campos
- recuperar o tipo de uma anotação
- recuperar uma anotação pelo seu tipo
- invocar operações em uma anotação para recuperar seus atributos

Anotações Nativas
Validação de Design
Impede a compilação se a anotação for violada
@FunctionalInterface
valida se uma interface é uma functional interface
@Override
valida se o método realmente existe na superclasse
Deprecated
A anotação
@Deprecated
possui os atributos:since
que indica a última versão que a classe ou método anotado pode ser utilizada sem problemas
forRemoval
que, quando verdadeiro, indica um intenção de remover o método ou classe em uma futura versão
SuppressWarnings
A anotação
@SuppressWarnings
especifica tipos de avisos que devem ser omitidos. (Não é recomendado pois podem omitir erros perigosos.)- Unchecked warnings: são causados ao atribuir um objeto sem tipo (e.g. de uma coleção sem tipo) a uma variável com um tipo
- Deprecation warnings: são causados pela utilização de métodos obsoletos


SafeVarargs
A anotação
@SafeVarargs
diz para o compilador não lançar erros de heap-pollution no método anotado.