Crear anotaciones es un proceso bastante simple, aunque está limitado por algunas reglas. Ahora tenemos que averiguar qué propósito práctico sirven.

Recordemos cómo creamos nuestra propia anotación.

Escribiremos una anotación que sea para clases y métodos y que contenga información sobre el autor y la versión del código:


@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
   String author() default "Author";
   String version() default "0.0";
}

Aquí están nuestras clases que anotamos:


@Info
public class MyClass1 {
   @Info
   public void myClassMethod() {}
}
 
@Info(version = "2.0")
public class MyClass2 {
   @Info(author = "Anonymous")
   public void myClassMethod() {}
}
 
@Info(author = "Anonymous", version = "2.0")
public class MyClass3 {
   @Info(author = "Anonymous", version = "4.0")
   public void myClassMethod() {}
}

¿Cómo podemos usar estos datos en tiempo de ejecución?

Mediante el uso de la reflexión para extraer metadatos de las anotaciones. Recuerda qué es la reflexión. La reflexión es un mecanismo para examinar datos sobre un programa en tiempo de ejecución. Reflection le permite obtener información sobre campos, métodos, constructores de clases y clases.

Usaremos la reflexión para leer las anotaciones en una clase y mostrar la información que queremos.

Leeremos los datos de nuestras clases en el método principal :


import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;
 
public class Main {
   public static void main(String[] args) throws NoSuchMethodException {
       readMyClass(MyClass1.class);
       readMyClass(MyClass2.class);
       readMyClass(MyClass3.class);
   }
 
   static void readMyClass(Class<?> myClassObj) throws NoSuchMethodException {
       System.out.println("\nClass: " + myClassObj.getName());
       readAnnotation(myClassObj);
       Method method = myClassObj.getMethod("myClassMethod");
       readAnnotation(method);
   }
 
   static void readAnnotation(AnnotatedElement element) {
       try {
           System.out.println("Search for annotations in " + element.getClass().getName());
           Annotation[] annotations = element.getAnnotations();
           for (Annotation annotation : annotations) {
               if (annotation instanceof Info) {
                   final Info fileInfo = (Info) annotation;
                   System.out.println("Author: " + fileInfo.author());
                   System.out.println("Version: " + fileInfo.version());
               }
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

Pasamos una instancia de nuestra clase al método readMyClass .

Luego podemos pasar una clase y un método al método readAnnotation . Hagámoslo: pasaremos un objeto Clase y un objeto Método. Toma un objeto que implementa la interfaz AnnotatedElement . Esto nos permite obtener una lista de anotaciones del objeto y obtener información sobre cada una de ellas.

Tenga en cuenta que solo obtenemos información después de verificar si la anotación pertenece a nuestro tipo de anotación: if (instancia de anotación de Info) .

La salida del programa nos da información completa de las anotaciones:

Clase: annotation.MyClass1
Buscar anotaciones en java.lang.Class
Autor: Autor
Versión: 0.0
Buscar anotaciones en java.lang.reflect.Method
Autor: Autor
Versión: 0.0

Clase: annotation.MyClass2
Buscar anotaciones en java.lang. Clase
Autor: Autor
Versión: 2.0
Buscar anotaciones en java.lang.reflect.Method
Autor: Anónimo
Versión: 0.0

Clase: annotation.MyClass3
Buscar anotaciones en java.lang.Class
Autor: Anónimo
Versión: 2.0
Buscar anotaciones en java. lang.reflect.Method
Autor: Anónimo
Versión: 4.0

Así, con la ayuda de la reflexión, pudimos extraer los metadatos.

Ahora veamos un ejemplo del uso de anotaciones para mejorar el código, incluido el aumento de la legibilidad, la velocidad y la calidad en general. Lombok nos ayudará con esto.

Lombok es un complemento del compilador que utiliza anotaciones para ocultar una gran cantidad de código y ampliar el lenguaje, lo que simplifica el desarrollo y agrega algunas funciones.

Considere un ejemplo de anotaciones de Lombok:

@ToString Genera una implementación del método toString() que consta de una representación completa del objeto: el nombre de la clase, todos los campos y sus valores.

@ToString
public class Example
@EqualsAndHashCode Genera implementaciones de equals y hashCode que usan campos no estáticos y no estáticos de forma predeterminada, pero son configurables. Se pueden encontrar más detalles en el sitio web del proyecto . Allí encontrará un ejemplo que usa @EqualsAndHashCode y también muestra una implementación estándar sin la anotación.
@Getter / @Setter Genera getters y setters para campos privados.

@Getter 
@Setter 
private String name = "name";
@NonNull Se utiliza para afirmar que los campos no son nulos cuando se crea una instancia de un objeto. De lo contrario, se lanza una NullPointerException .

public Example(@NonNull P p) {
 super("Hello");
 this.name = p.getName();
}

Lombok tiene muchas más anotaciones útiles que se usan con menos frecuencia. Hemos considerado sus anotaciones más simples. Puedes leer más sobre el proyecto en el sitio web oficial .