martes, 31 de marzo de 2009

Annotations

Más allá del @SuppressWarnings("unchecked"), @Override, ect... no había usado las anotaciones hasta que las usamos con Hibernate, pero no había pasado de ahí.

Hace poco, intenté aprovechar su potencial, creando mis propias anotaciones, lo que resulto ser muy sencillo. Supongamos que queremos implementar un método genérico que realice comprobaciones sobre algunos campos de la instancia pasada por parámetro. Lo primero que debemos hacer es poder marcar en nuestras clases qué campos deben ser comprobados, y qué comprobación se debe realizar. Para ello, usaré mi propia anotación en los getters de los mismos:


package es.gmr.pruebas;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MiAnotacion {
   int opcion ();
}


Del código anterior cabe destacar:
  1. @Retention: con esta anotación especificamos el tiempo de vida que va a tener
    nuestra nueva anotación: RetentionPolicy.SOURCE indica que la
    anotación sólo debe ser visible para el código fuente e ignorada por el compilador y
    la máquina virtual, RetentionPolicy.CLASS es tenida en cuenta por el compilador
    pero ignorada por la máquina virtual, y RetentionPolicy.RUNTIME va a ser tenida
    en cuenta por la máquina virtual en tiempo de ejecución.
  2. @Target: cuando desarrollamos una nueva anotación, deberemos especificarle a
    qué tipo de elemento del código es aplicable. De esta manera, podemos acceder a
    los tipos por medio de constantes definidas en la clase ElementType. En este caso se ha indicado que serán aplicadas a los métodos, ya que la usaremos en los getters.
El siguiente paso es añadir esta anotación en donde nos interese:

package es.gmr.pruebas;
public class MiClase {
   public String campo1;
   public String campo2;
   public String campo3;

   @MiAnotacion(opcion = 1)
   public String getCampo1() {
      return campo1;
   }
   public void setCampo1(String campo1) {
      this.campo1 = campo1;
   }

   @MiAnotacion(opcion = 2)
   public String getCampo2() {
      return campo2;
   }
   public void setCampo02(String campo2) {
      this.campo2 = campo2;
   }

   public String getCampo3() {
      return campo3;
   }
   public void setCampo3(String campo3) {
      this.campo3 = campo3;
   }
}

En MiClase hemos indicado que al campo1 se le aplicará la comprobación marcada con un 1 (lo ideal sería usar constantes para cada tipo de comprobación), al campo2 la comprobación marcada con un 2 y sobre el campo3 no se realizarán comprobaciones.

Por último implementamos el método que realice las comprobaciones:


package es.gmr.pruebas;
import java.lang.reflect.*;
public class Comprobacion {
   public void comprobar(Object obj){
      Method[] methods =          command.getClass().getMethods();
      for (Method metodo : methods){
         if (!metodo.getName().startsWith("get")){
            continue;
         }

         MiAnotacion aux =
            metodo.getAnnotation(MiAnotacion .class);
         if (aux!= null){
            switch (aux.opcion()){
               ...
            }
         }
   }
}

No hay comentarios:

Publicar un comentario