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:
que hay de la anotacion @PersistentContext
Por: mines el Septiembre 22, 2008
a las 5:32 pm
podrias dar algunos detalls sobre la anotacion @PersistenceContext.
Gracias.
Por: mines el Septiembre 22, 2008
a las 5:40 pm
Hola, esa anotación no es de java SE sino de java EE. Tienes la descripción completa aqui:
http://edocs.bea.com/wls/docs100/ejb30/annotations.html#wp1424642
Por: jotas el Septiembre 24, 2008
a las 7:44 am
Esta muy bueno, gracias
y talvez me puedan ayudar en formas de declarar variable como:
ArrayList conten = new ArrayList();
la parte quisiera saber que hace en realidad… o talvez puedan escribir una nueva entrada para ello.
soy nuevo en java…
saludos
Por: debugger el Abril 8, 2009
a las 1:23 pm
ArrayList\ ids = new ArrayList\();
y quisiera saber que hace \
Por: debugger el Abril 8, 2009
a las 1:25 pm
uffffff este blog es muy estricto con los simbolos de mayor y menor
ArrayList[signo menor que ]String[signo mayor que] ids = new ArrayList[signo menor que ]String[signo mayor que]();
y quisiera saber que hace [signo menor que ]String[signo mayor que]
Por: debugger el Abril 8, 2009
a las 1:28 pm
eso angulares indican el tipo de dato que vas a tener en el ArrayList, si lo que esta dentro de los angulares es String el arreglo es de String.
Por: Alejandro el Agosto 21, 2009
a las 8:34 pm