Anotaciones en Java

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 una clase 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;
}
Hi! If you find my posts helpful, please support me by inviting me for a coffee :)

Ver también