Todos usamos en el día a día Java Annotations .Sin embargo no siempre entendemos como el lenguaje Java las procesa. Es decir estamos más que acostumbrados a usar @Ejb o @Entity para la capa de persistencia o para la gestión de servicios . Ahora bien ¿Cómo son procesadas o cómo son construidas?. Vamos a ver un ejemplo sencillo de crear una anotación y procesarla con Java. El primer paso es definir la anotación con las propiedades que dispone.
package com.arquitecturajava; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.FIELD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Imprimible { boolean mayusculas() default false; }
Java Annotations y Anotaciones
Lo primero que nos sorprende es que las propias anotaciones Java llevan aplicadas anotaciones. Podemos ver @Target y @Retention. @Target nos indica en que lugares se puede aplicar esta anotación . En nuestro caso tanto en clases como en propiedades (Type,Field).La anotacion Retention valora si la anotación se chequea en tiempo de ejecucion.Una vez definido esto usamos @interface y le asignamos un nombre. El último paso es añadir propiedades a la anotación por si permite parametrizaciones.
En nuestro caso la anotación permite un parámetro de mayusculas true/false. Vamos a ver ahora como se aplica la anotación a una clase normal como es la clase Libro.
package com.arquitecturajava; public class Libro { @Imprimible(mayusculas=false) String titulo; @Imprimible(mayusculas=true) String autor; public Libro(String titulo, String autor) { super(); this.titulo = titulo; this.autor = autor; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public String getAutor() { return autor; } public void setAutor(String autor) { this.autor = autor; } }
Hemos aplicado la anotación sobre una clase . Nuestra anotación nos informa si tenemos que procesar los objetos e imprimir la información en mayusculas o minúsculas por pantalla. Nos queda construir un programa Java que sea capaz de procesar las anotaciones . Para ello haremos uso del API de Reflection. Veamos el código:
package com.arquitecturajava; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class Principal { public static void main(String[] args) { List<Object> lista = new ArrayList<Object>(); lista.add(new Libro("titulo1", "pedro")); procesar(lista); } public static void procesar(List<Object> lista) { try { for (Object o : lista) { Field[] campos = o.getClass().getDeclaredFields(); for (Field campo : campos) { Imprimible imprimir = campo.getAnnotation(Imprimible.class); // System.out.println(imprimir); if (imprimir != null) { if (imprimir.mayusculas()) { System.out.println(campo.get(o).toString().toUpperCase()); } else { System.out.println(campo.get(o).toString()); } } } } } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
El código es complejo de entender pero vamos a ver si podemos explicarlo paso a paso
- Recorremos la lista de Objetos
- Por cada Objeto leemos las propiedades (campos) que tiene “getDeclaredFields()”
- El siguiente paso es comprobar si el campo dispone de la anotaccion Imprimible getAnnotation(Imprimible.class)
- Si esa anotacion existe , comprobamos si la propiedad mayuscula esta a true o false
- Imprimimos por consola los datos
Un diagrama lo deja un poco más claro:
Por último nos queda ejecutar e imprimir la información en pantalla:
Hemos creado nuestras propias Java Annotations. Este tipo de enfoque puede ser útil cuando queremos diseñar nuestros propios frameworks.
Otros artículos relacionados:
Muchas gracias por el ejemplo, Estoy leyendo tu libro y me parece excelente! Muchas gracias por el trabajo que haces! Saludos desde Argentina.
De nada 🙂
Buenísimo
gracias 🙂
Excelente artículo. Es sencillo entender el funcionamiento de las anotaciones con tu ejemplo.
de nada 🙂
Bien escrito y bien explicado. Gracias Cecilio!
de nada 🙂
gracias 🙂
Excelente artículo querido Cecilio. Tu claridad y sencillez son magníficas para poder entender los conceptos más fielmente. Van para ti mis sinceras felicitaciones.
gracias 🙂