Anotaciones en Java

By | 09/21/2014

Una Anotación Java es una forma de añadir METADATOS  a nuestro código que luego podremos procesar.

Esta tan fácil como crear una interfaz y agregarle la arroba @

public @interface MiAnotacion {
String id();
String nombre();
}

Un ejemplo muy simple. Crearemos una anotación para validar un atributo de tipo string.

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface StringValid {

public int minLength();

public int maxLength();

}

El agregado de @Retention(RetentionPolicy.RUNTIME) nos permitirá leer la anotación en runtime (tiempo de ejecución).

El agregado del @Target(ElementType.FIELD) indica que esta anotación sólo puede ser aplicada a atributos (field)

Crearemos un bean común, por ejemplo para un guardar un usuario.

public class User {

private int id;
private String name;
private String password;

//... seters y geters...

}

Ahora anotaremos la clase User

Nos quedará así…

public class User {

    private int id;

    @StringValid(minLength = 1, maxLength = 120)
    private String name;

    @StringValid(minLength = 6, maxLength = 20)
    private String password;

   //... seters y geters...

}

Bien ahora haremos algo mas interesante, procesaremos el bean User y lo validaremos:

//--

import java.lang.reflect.Field;

public class UserProcess {

    public static void main(String[] args) throws Exception {

        // Creamos nuestro objecto y lo seteamos
        User user = new User();
        user.setId(1);
        user.setName("Gustavo");
        user.setPassword("pass");

        // recorremos todos los atributos de la clase
        for (Field field : user.getClass().getDeclaredFields()) {

            if(! field.isAnnotationPresent(StringValid.class)){
                continue; // no tiene anotacion
            }

            // tomamos la anotacion de atributo
            StringValid stringValidAnnotation = field.getAnnotation(StringValid.class);

            // hago accesible el atributo privado
            field.setAccessible(true);

            // obtengo el valor del atributo
            String valueString = (String) field.get(user);

            System.out.print("Nombre del atributo: " + field.getName());
            System.out.print(" - contiene: " +  valueString);
            System.out.print(" - minimo permitido: " + stringValidAnnotation.minLength());
            System.out.print(" - maximo permitido: " + stringValidAnnotation.maxLength());

            System.out.print(" - length: " + valueString.length());

            // valido comparando el lenght del valor seteado con el lenght permitido 

            if(valueString.length() < stringValidAnnotation.minLength()){
                System.out.print(" - ES MENOR QUE EL MINIMO PERMITIDO " + stringValidAnnotation.minLength());
            }

            if(valueString.length() > stringValidAnnotation.maxLength()){
                System.out.print(" - ES MAYOR QUE EL MAXIMO PERMITIDO " + stringValidAnnotation.minLength());
            }

            System.out.println("");
            System.out.println("----------");

        }        

    }

}

//--

Elementos que son importantes tener presente:

@Retención indica si la anotación estará disponibles en el código fuente (SOURCE), en la clase (CLASS), o en tiempo de ejecución (RUNTIME).  En nuestro ejemplo necesitábamos usarla en Rutime.
@Target indica donde podrá ser aplicada la anotación (en el constructor, en un método, en la clase, etc). Los argumentos pueden ser:  CONSTRUCTOR, FIELD,  METHOD,  PACKAGE,  PARAMETER,  TYPE

Podemos tambien definir un valor por ‘default’ para la anotación de esta forma

Anotaciones Valor Default

Esto hará que  ‘minLength’ no sea obligatorio (cuando estemos anotando nuestro atributo), tomando el valor por default.

public class User {

    private int id;

    @StringValid(maxLength = 120) // hemos omitido minLength
    private String name;

    @StringValid(minLength = 6, maxLength = 20)
    private String password;
}

¿Te ha servido esta entrada?

Compartir esto:

2 thoughts on “Anotaciones en Java

  1. warhar

    Hola, casi no consigo encontrar este blog. Me parece interesante tu ejemplo de validar el campo… eso me muestra una pequeña aplicación de las anotaciones, me agradó.

    Saludos.

    Reply

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *