terça-feira, 7 de janeiro de 2014

@Annotations "metadados" que não interferem diretamente no código anotado

Muito pensam que a anotação só serve para fazer com que a IDE pare de dar avisos sobre a falta das mesmas, pois são as mais comuns utilizadas por quem programa em java, um exemplo é a @Override que serve para informar ao compilador que o elemento esta sobrescrevendo um outro elemento declarado na superclasse. Mas existem vários tipos de anotações, como as que fornecem informações para o compilador ou as Compiler-time and deployment-time que servem para ser usadas em frameworks que geram códigos como o xml e para realizar validações em campos entre outras, existe também as de runtime que são lidas em tempo de execução.
Mas para que possamos usar as anotações de uma maneira mais abrangente podemos também criar nossas próprias anotações, a regra é a mesma da interface com o detalhe que devemos colocar o "@" antes da palavra "interface".

Exemplo:
public @interface MinhaInterface{

}

Ainda é possível declarar métodos que devem ser obrigatoriamente implementados na anotação, assim como nas interfaces, mas estes métodos não devem possuir quaisquer parâmetros, não devem lançar quaisquer exceções e o tipo de retorno deve ser do tipo primitivo, um String, um Class, um Enum ou ainda um array de um destes tipos.

Exemplo:

public @interface MinhaInterface{

String nome();
String valor();

}


Mas além das annotations existem também as Meta-annotations que servem para definir o comportamento da anotação, são elas: Target, Retention, Documented, Inherited

@Target Indica em qual elemento da classe a anotação pode ser aplicada

@Target(ElementType.TYPE) Pode ser aplicada a qualquer elemento da classe.
@Target(ElementType.FIELD) Pode ser aplicada a um campo ou propriedade.
@Target(ElementType.METHOD) Pode ser aplicada a um método.
@Target(ElementType.PARAMETER) Pode ser aplicada a parâmetros de um método
@Target(ElementType.CONSTRUCTOR) Pode ser aplicada a construtores.
@Target(ElementType.LOCAL_VARIABLE) Pode ser aplicada a variáveis locais.
@Target(ElementType.ANNOTATION_TYPE) Indica que o próprio tipo declarado é uma anotação de anotação.

@Retention Indica onde e quando as anotações deste tipo serão obtidas.

@Retention(RetentionPolicy.SOURCE) Serão obtidas somente em nível de fonte e serão ignoradas pelo compilador.
@Retention(RetentionPolicy.CLASS) Serão obtidas somente em nível de compilação e serão ignoradas pela VM.
@Retention(RetentionPolicy.RUNTIME) Obtidas pela VM e serão lidas apenas em runtime.

@Documented Indica se a anotação pertencerá ao javadoc ou algum outro gerador de documentação por padrão.

@Inherited Indica se a anotação sera herdada pelas subclasses automaticamente, sendo assim, caso haja uma consulta procurando por uma anotação qualquer, se a classe consultada não possuir a anotação a classe pai sera consultada por padrão.

Exemplo:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE
public @interface MinhaInterface{

String nome();
String valor();

}
Exemplo de uso:

@MinhaInterface(nome = "Bruno", valor = "R$ 0,00")
public class Pessoa {

private String nome;
private String telefone;

public Pessoa(){
}
}



Bom pessoal aqui fica um breve post de como usar annotation, qualquer duvida www.google.com

Nenhum comentário:

Postar um comentário