Das Erstellen von Anmerkungen ist ein recht einfacher Vorgang, der jedoch durch einige Regeln eingeschränkt ist. Jetzt müssen wir herausfinden, welchen praktischen Zweck sie erfüllen.

Erinnern wir uns daran, wie wir unsere eigene Anmerkung erstellen.

Wir schreiben eine Anmerkung, die für Klassen und Methoden gilt und Informationen über den Autor und die Version des Codes enthält:

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

Hier sind unsere Klassen, die wir kommentiert haben:

@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() {}
}

Wie können wir diese Daten zur Laufzeit nutzen?

Durch die Verwendung von Reflektion zum Extrahieren von Metadaten aus Anmerkungen. Erinnern Sie sich daran, was Reflexion ist. Reflexion ist ein Mechanismus zum Untersuchen von Daten über ein Programm zur Laufzeit. Mit Reflection können Sie Informationen zu Feldern, Methoden, Klassenkonstruktoren und Klassen abrufen.

Wir verwenden Reflection, um die Anmerkungen in einer Klasse zu lesen und die gewünschten Informationen anzuzeigen.

Wir lesen Daten aus unseren Klassen in der Hauptmethode :

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();
       }
   }
}

Wir übergeben eine Instanz unserer Klasse an die readMyClass- Methode.

Dann können wir sowohl eine Klasse als auch eine Methode an die readAnnotation- Methode übergeben. Machen wir das – wir übergeben ein Class-Objekt und ein Method-Objekt. Es benötigt ein Objekt, das die AnnotatedElement- Schnittstelle implementiert. Auf diese Weise können wir eine Liste der Anmerkungen zum Objekt abrufen und Informationen zu jeder einzelnen Anmerkung erhalten.

Beachten Sie, dass wir Informationen erst erhalten, nachdem wir überprüft haben, ob die Annotation zu unserem Annotationstyp gehört: if (annotation instanceof Info) .

Die Programmausgabe liefert uns vollständige Informationen aus den Anmerkungen:

Klasse: annotation.MyClass1
Suche nach Annotationen in java.lang.Class
Autor: Autor
Version: 0.0
Suche nach Annotationen in java.lang.reflect.Method
Autor: Autor
Version: 0.0

Klasse: annotation.MyClass2
Suche nach Annotationen in java.lang. Klassenautor
: Autor
Version: 2.0
Suche nach Annotationen in java.lang.reflect.Method
Autor: Anonymous
Version: 0.0

Klasse: annotation.MyClass3
Suche nach Annotationen in java.lang.Class
Autor: Anonymous
Version: 2.0
Suche nach Annotationen in Java. lang.reflect.Method
Autor: Anonymous
Version: 4.0

So konnten wir mithilfe der Reflexion die Metadaten extrahieren.

Schauen wir uns nun ein Beispiel für die Verwendung von Anmerkungen zur Verbesserung von Code an, einschließlich der Verbesserung der Lesbarkeit, Geschwindigkeit und Qualität im Allgemeinen. Lombok wird uns dabei helfen.

Lombok ist ein Compiler-Plugin, das Annotationen verwendet, um eine große Menge Code zu verbergen und die Sprache zu erweitern, wodurch die Entwicklung vereinfacht und einige Funktionen hinzugefügt werden.

Betrachten Sie ein Beispiel für Anmerkungen aus Lombok:

@ToString Erzeugt eine Implementierung der toString() -Methode, die aus einer vollständigen Darstellung des Objekts besteht: dem Klassennamen, allen Feldern und ihren Werten.
@ToString
public class Example
@EqualsAndHashCode Erzeugt Implementierungen von equal und hashCode , die standardmäßig nicht statische und nicht statische Felder verwenden, aber konfigurierbar sind. Weitere Details finden Sie auf der Website des Projekts . Dort finden Sie ein Beispiel, das @EqualsAndHashCode verwendet und auch eine Standardimplementierung ohne die Annotation zeigt.
@Getter / @Setter Erzeugt Getter und Setter für private Felder.
@Getter
@Setter
private String name = "name";
@NonNull Wird verwendet, um sicherzustellen, dass Felder nicht null sind, wenn ein Objekt instanziiert wird. Andernfalls wird eine NullPointerException ausgelöst.
public Example(@NonNull P p) {
 super("Hello");
 this.name = p.getName();
}

Lombok verfügt über viele weitere nützliche Anmerkungen, die seltener verwendet werden. Wir haben die einfachsten Anmerkungen betrachtet. Mehr über das Projekt können Sie auf der offiziellen Website lesen .