Anotaciones en Java

Post date: Apr 7, 2012 9:55:44 AM

El mecanismo de reflexión de Java permite acceder a las anotaciones asociadas a las clases en Java en tiempo de ejecución.

Definición de anotaciones

Las anotaciones fueron introducidas en la versión 5 del lenguaje. Una anotación es una especie de comentario o meta dato que puede adjuntarse el código Java. Las anotaciones pueden ser procesadas durante las fases de compilación por preprocesadores o durante la ejecución por la vía del mecanismo de reflexión de Java. Veamos un ejemplo:

@MiAnotacion(nombre="elNombre", valor = "Saludo")

public class MiClase {}

La clase MiClase tiene la anotación @MiAnotacion como prefijo. Las anotaciones se definen como interfaces. Veamos la definición de esta anotación:

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.TYPE)

public @interface MiAnotacion {

public String nombre();

public String valor();

}

EL símbolo @ que precede la palabra interface señala esta definición como la de una anotación. Una vez definida, la anotación puede ser utilizada el el código. En la definición de esta anotación se utilizaron dos anotaciones utilizadas como directivas de compilación. La directiva @Retention( RetentionPolicy.RUNTIME ) indica que las anotaciones se pueden utilizar en tiempo de ejecución vía el mecanismo de reflexión. Sin esta anotación, la nueva anotación no estará disponible en tiempo de ejecución. La directiva @Target(ElementType.TYPE) indica que la anotación sólo se utiliza como prefijo de los tipos (clases e interfaces). Otras opciones son METHOD y FIELD par indicar que se usan en prefijo de esas construcciones. Cuando no se incluye esta directiva, las anotaciones pueden usarse como prefijo de tipos, métodos y campos.

Anotaciones de clases

Para acceder a las anotaciones de clases se utiliza el objeto Class de la clase:

Class miClase = MiClase.class;

Annotation[] anotaciones = miClase.getAnnotations();

for(Annotation anotacion : anotaciones){

if( anotacion instanceof MiAnotacion){

MiAnotacion miAnotacion = (MiAnotacion) anotacion;

System.out.println("nombre: " + miAnotacion.nombre());

System.out.println("valor: " + miAnotacion.valor());

}

}

También se puede acceder a una anotación específica:

Class miClase = MiClase.class;

Annotation anotacion = miClase.getAnnotation(MiAnotacion.class);

if(anotacion instanceof MiAnotacion) {

MiAnotacion miAnotacion = (MiAnotacion) anotacion;

System.out.println("nombre: " + miAnotacion.nombre());

System.out.println("valor: " + miAnotacion.valor());

}

Anotaciones de métodos

Si omitimos la directiva @Target de la definición de la anotación podemos utilizarla en los métodos:

public class MiClase {

@MiAnotacion(nombre="unNombre", valor = "Saludos")

public void hacerAlgo(){ ... }

}

A esta anotación se accede a través del objeto asociado al método hacerAlgo:

Method metodo = ... //obtener el objeto método

Annotation[] anotaciones = metodo.getDeclaredAnnotations();

for(Annotation anotacion : anotaciones){

if(anotacion instanceof MiAnotacion){

MiAnotacion miAnotacion = (MiAnotacion) anotacion;

System.out.println("nombre: " + miAnotacion.nombre());

System.out.println("valor: " + miAnotacion.valor());

}

}

También se puede acceder a una anotación específica de un método:

Method metodo = ... //obtener el objeto método

Annotation anotacion = metodo.getAnnotation(MiAnotacion.class);

if(anotacion instanceof MiAnotacion){

MiAnotacion miAnotacion = (MiAnotacion) anotacion;

System.out.println("nombre: " + miAnotacion.nombre());

System.out.println("valor: " + miAnotacion.valor());

}

Anotaciones en los parámetros

También es posible anotar las declaraciones de parámetros, por ejemplo en la siguiente definición:

public class MiClase {

public static void hacerOtraCosa(

@MiAnotacion(nombre="unNombre", valor="unValor")

String parametro) {}

}

Igualmente se accede a las anotaciones de parámetros a través del objeto asociado al método:

Method metodo = ... //obtener el objeto método

Annotation[][] anotacionesParametros = metodo.getParameterAnnotations();

Class[] tiposParametros = metodo.getParameterTypes();

int i=0;

for(Annotation[] anotaciones : anotacionesParametros ){

Class tipoParametro = tiposParametros[i++];

for(Annotation anotacion : anotaciones){

if(anotacion instanceof MiAnotacion){

MiAnotacion miAnotacion = (MiAnotacion) anotacion;

System.out.println("param: " + tipoParametro.getName());

System.out.println("nombre: " + miAnotacion.nombre());

System.out.println("valor: " + miAnotacion.valor());

}

}

}

Las anotaciones de parámetros se representan con un arreglo bidimensional dado que cada parámetro podría tener más de una anotación.

Anotaciones de campos

Veamos un ejemplo de anotación de campo:

public class MiClase {

@MiAnotacion(nombre="nombre", valor = "valor")

public String miCampo = null;

}

Se accede a las anotaciones de los campos a través del objeto Field correspondiente:

Field campo = ... //obtener el objeto Field del campo

Annotation[] anotaciones = campo.getDeclaredAnnotations();

for(Annotation anotacion : anotaciones){

if(anotacion instanceof MiAnotacion){

MiAnotacion miAnotacion = (MiAnotacion) anotacion;

System.out.println("nombre: " + miAnotacion.nombre());

System.out.println("valor: " + miAnotacion.valor());

}

}

Para acceder a una anotación específica se usa el método getAnnotacion:

Field campo = ... //obtener el objeto Field del campo

Annotation anotacion = field.getAnnotation(MiAnotacion.class);

if(anotacion instanceof MiAnotacion) {

MiAnotacion miAnotacion = (MiAnotacion) anotacion;

System.out.println("nombre: " + miAnotacion.nombre());

System.out.println("valor: " + miAnotacion.valor());

}

Enlaces relacionados

Cursos relacionados