Der Hauptvorteil von Annotationen liegt nicht in der Verwendung der Standardanmerkungen, die bereits im JDK vorhanden sind. Gleichzeitig besteht selten die Notwendigkeit, eine eigene Anmerkung zu erstellen. Wenn wir jedoch ein großes System entwickeln oder eine separate Bibliothek erstellen, wird sich die Implementierung unserer eigenen Annotation auf architektonischer Ebene definitiv auszahlen.

Versuchen wir, eine Anmerkung zu erstellen.

Erstellen Sie dazu eine Datei, aber anstatt class oder interface zu schreiben , schreiben Sie @interface . Dies wird die Datei für unsere Anmerkung sein. Die interne Struktur einer Annotation ähnelt der einer Schnittstelle.

public @interface Sum {
   int sum() default 0;
}

@interface gibt an, dass es sich um eine Annotation handelt,
default besagt, dass der Parameter einen bestimmten Standardwert haben wird.

Ta-da! Wir haben eine Anmerkung erstellt! Theoretisch können wir es bereits verwenden, aber zuerst wäre es besser, es zu konfigurieren.

Ohne Konfiguration kann unsere Annotation auf alles angewendet werden (auf Klassen, Methoden, Attribute usw.), daher macht es an dieser Stelle wenig Sinn, sie zu verwenden. So seltsam es auch erscheinen mag, unsere Anmerkung muss mit anderen Anmerkungen versehen werden!

Beginnen wir mit @Target .

Die @Target- Annotation (relevant seit Java 1.5) schränkt die Möglichkeit ein, eine Annotation anzuwenden. Um die Nutzung auf ein bestimmtes Maß zu beschränken, müssen wir ein Argument an die @Target- Annotation übergeben, um anzugeben, auf welche Typen sie angewendet werden kann. Hier sind einige der am häufigsten verwendeten Typen:

@Target(ElementType.PACKAGE) für Pakete
@Target(ElementType.TYPE) für den Unterricht
@Target(ElementType.CONSTRUCTOR) für Konstrukteure
@Target(ElementType.METHOD) für Methoden
@Target(ElementType.FIELD) für Attribute (Variablen) in einer Klasse
@Target(ElementType.PARAMATER) für Methodenparameter
@Target(ElementType.LOCAL_VARIABLE) für lokale Variablen

Wenn Sie eine Annotation für mehrere Typen benötigen, können Sie mehrere Argumente als Array übergeben:

@Target({ ElementType.PARAMETER, ElementType.LOCAL_VARIABLE })

Der nächste wichtige Teil der Konfiguration ist die Annotation @Retention .

Diese Annotation gibt die Teile des Code-Lebenszyklus an, in denen unsere Annotation verfügbar sein wird:

RetentionPolicy.SOURCE Anmerkungen, die mit der Aufbewahrungsrichtlinie SOURCE gekennzeichnet sind , werden zur Laufzeit verworfen.
RetentionPolicy.CLASS Mit der CLASS- Aufbewahrungsrichtlinie markierte Anmerkungen werden in die .class- Datei geschrieben, aber zur Laufzeit entfernt.
RetentionPolicy.RUNTIME Anmerkungen, die mit der RUNTIME- Aufbewahrungsrichtlinie gekennzeichnet sind, bleiben zur Laufzeit bestehen und können in unserem Programm zur Laufzeit abgerufen werden.

Es gibt noch ein paar weitere Anmerkungen, die Sie für die Konfiguration verwenden können:

Anmerkung Wert
@Vererbt Gibt an, dass eine abgeleitete Klasse die Implementierung der Annotation einer übergeordneten Klasse erbt.
@Dokumentiert Dies zeigt an, dass die Anmerkung in die generierte Javadoc-Dokumentation aufgenommen wird.

Versuchen wir nun, unsere eigene Anmerkung zu erstellen.

Wir erstellen eine Annotation für Klassen und Methoden, die 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";
}

Wir können unsere Annotation auf Methoden und Klassen anwenden. Die Metadaten unserer Annotation sind zur Laufzeit verfügbar. Achten Sie auf die Parameter unserer Annotation: Wir können zwei Argumente angeben (Autor und Version) oder sie weglassen. Wenn wir sie weglassen, werden die angegebenen Standardwerte ( Standard „Autor“ und Standard „0.0“ ) verwendet.

Es ist erwähnenswert, dass wir keinen Standardwert für Parameter angeben müssen. In diesem Fall wird der Parameter obligatorisch.

Bei der Übergabe von Argumenten müssen wir den entsprechenden Parameter mit der Notation value = „value“ angeben . Der Parameter muss immer explizit benannt werden, auch wenn die Annotation einen einzelnen Parameter enthält.

Wenden wir unsere Anmerkung auf einige Klassen an:

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