Las anotaciones son un mecanismo para dotar a las clases de Meta información o auto información. Estas ya existían en versiones de java anteriores y de hecho se usaban, por ejemplo para generar el javaDoc (@Deprecated). Pero desde la versión 1.5 (Tiger! oh yeah) se han convertido en una parte Tipada del lenguaje y podemos trabajar con ellas tanto en tiempo de compilación como en tiempo de ejecución.
Anotar una porción de código nos sirve para procesarla de alguna manera en algún script, herramienta de despliegue o de diseño, para hacer uso de ellas en un framework, para trabajarlas distintas por un compilador…
Decía que las anotaciones se pueden trabajar en tiempo de ejecución. La forma de hacerlo sería usando el API de reflection, que se ha completado en Java 5 para tener acceso a las anotaciones.
Por ejemplo en la clase Class tenemos:
<A extends Annotation> A getAnnotation(Class<A> annotationClass)
Annotation[] getDeclaredAnnotations()
boolean isAnnotation()
Tenemos métodos similares en las clases de reflexión java.lang.reflect.Field, java.lang.reflect.Method… Puesto que las anotaciones pueden ir a cada uno de estos niveles.
Además la plataforma java incluye un herramienta apt para trabajar con anotaciones. %JAVA_HOME%/bin/apt
Para distinguir las anotaciones, estas vienen precedidas siempre de una arroba (@ Toma!). Y se pueden clasificar en 3 tipos:
- Marker annotations: Anotaciones que no reciben ningún parámetro. Marcan algún elemento. La única información que nos da esta anotación es que se tiene o no se tiene.
- Normal annotations: Anotaciones que reciben argumentos en forma de pares nombreParametro=valorParametro
- Single member annotations: Anotaciones que sólo tienen un miembro y este se llama value, no necesitan indicar el nombreParametro, solo el valorParametro.
Además estan las built in annnotations, es decir, las que ya forman parte del lenguaje, que en la versión java SE5 son 3:
- Overrides: Indica que el método esta siendo sobreescrito, tenemos un error de compilación si el método no es sobreescrito. (Si nos equivocamos al teclearlo).
- Deprecated: Indica que el método esta deprecado y no debería usarse y nos genera un warning en compilación.
- SupressWarnings: Recibe una lista de argumentos y le indican al compilador que no muestre los warnings de los tipos pasados como argumento. (“all”,”checked”,”finally”).
Las anotaciones pueden a su vez estar anotadas, es decir, en la definición de una anotación podemos anotarlas usando meta-anotaciones.
Estas son:
- Target: Indica sobre que elementos puede usarse la anotación. Recibe un array de argumentos y las posibilidades son: TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE.
- Retention: Indica el alcance de la anotación. Las posibilidades son:
- SOURCE: La anotación sólo existe en el fuente, no en la clase compilada.
- CLASS: Por defecto. La anotación existe en la clase pero la maquina virtual la ignora en ejecución.
- RUNTIME: La máquina virtual tiene acceso a ella y es necesaria si queremos acceder reflexivamente a ella.
- Inherited: Indica que la anotación la heredan las subclases.
- Documented: Indica que las herramientas de documentacion tipo javaDoc tienen que documentarla.
Así pues la forma de crear un Annotation Type (Lo que sería la Clase de los objetos anotación) utilizaremos la sintaxis:
@Meta-anotacion1(miembros)
@Meta-anotacion2(miembros)
…..
modificadores @interface NombreTipoAnotación{
TipoMiembro1 nombreMiembro1();
TipoMiembro2 nombreMiembro2() default valorPorDefecto;
…
}
Más claro lo tenemos en el ejemplo de la anotación built-in SupressWarnings:
package java.lang;
import java.lang.annotation.*;
import java.lang.annotation.ElementType;
import static java.lang.annotation.ElementType.*;
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR,
LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
Como cosa curiosa, al construir tipos de anotaciones estamos usando la notacion @interface aunque en realidad lo que ocurre es que estamos extendiendo de la intefaz java.lang.annotation.Annotation, Pero si la extendieramos directamente NO conseguiríamos una anotación.
BIBLIOGRAFÍA:
Annotations java.sun.com
Novedades en J2SE 5.0 (Tiger), Iker Hurtado Díaz de Cerio
Learn to Use the New Annotation Feature of Java 5.0