Dies ist ein praktisches Tutorial, in dem Sie lernen, wie Sie in Ihrem Java-Programm Ihre eigenen benutzerdefinierten Annotationstypen erstellen können. Aber dies ist ich auch eine Einführung in das Java-Annotationspaket, die für Sie nützlich sein kann.
In Java haben Sie Annotationen wie "@Override", "@Id" und mehr. Diese werden verwendet, um das Verhalten von Objekten, Funktionen und mehr anzupassen.
Sie können aber auch Ihre eigene Annotation (Annotationstyp) erstellen, wobei Sie definieren können, was die Annotation auf dem Ziel (Objekte, Funktionen usw.), auf dem sie aufgerufen wird, tun soll.
Ein Annotationstyp wird durch eine spezielle Java-Interface-Klasse mit dem Bezeichner "@interface" erzeugt.
Annotation ohne Attribut
Diese Annotation wird direkt mit ihrem Namen aufgerufen.
Beispiel:
public @interface MyCustomAnnotation {
}
Sie können den von Ihnen erstellten Annotationstyp wie folgt verwenden:
@MyCustomAnnotation
private String myVariable;
In diesem Beispiel hat die Annotation keine Attribute. Sie können aber auch das tun, was wir in den folgenden Abschnitten sehen werden.
Annotationen mit einem Attribut
Dieses Beispiel initialisiert den aktuellen Temperaturgrad der Stadt, der in den Attributen dieser Annotation übergeben wurde. In diesem Tutorial wird nur der Teil gezeigt, der die Erstellung von Annotationen betrifft.
public @interface CurrentDegreesCity {
String cityName();
}
Der Annotationstyp muss nicht wie in diesem Beispiel "public" sein. Sie können auch andere Zugriffsmodifikatoren (Ebenen) als "public" haben.
Diese Annotation kann wie folgt aufgerufen werden:
@CurrentDegreesCity(cityName="seoul")
private int deegresSeoul;
Sie können nur ein Attribut übergeben. Wenn Sie jedoch eine unterschiedliche Anzahl an Attributen übergeben, dann erhalten Sie einen Compiler-Fehler. Wenn Sie das wollen, dann müssen Sie das Interface "CurrentDegreesCity" um eine weitere Methodendeklaration erweitern.
Ein Interface vom Typ "Annotation" kann keine Mitglieder haben, die eine Ausnahme auslösen oder einen "ungültigen" Rückgabewert haben. Dies führt zu einem Compiler-Fehler.
FALSCH:
public @interface CurrentDegreesCity {
void cityName();
}
FALSCH:
public @interface CurrentDegreesCity {
String cityName() throws IOException;
}
Annotationen mit Attributen, die mehrere Elemente enthalten
Sie können auch Attribute haben, bei denen Sie ein Array als Wert hinzufügen können. Auf diese Weise können Sie einem Attribut mehrere Werte hinzufügen.
In diesem Beispiel werden wir ein Array von Zeichenketten übergeben, das die Namen von Wochentagen enthält.
public @interface WeekdaysDegreesCity {
String cityName();
String[] weekdays();
}
Diese Annotation kann wie folgt bezeichnet werden:
@CurrentDegreesCity(cityName="seoul",
weekdays={ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" })
private int workingWeekDeegresSeoul;
Wenn Sie nur einen Wert an die Annotation übergeben, können Sie auch die geschweiften Klammern entfernen.
Beispiel:
@CurrentDegreesCity(cityName="seoul", weekdays="Monday")
private int workingWeekDeegresSeoul;
Annotationen mit optionalen Attributen
Wenn Sie Attribute haben möchten, die optional hinzugefügt werden können, dann müssen Sie einen Standardwert für dieses Attribut definieren.
Verwenden Sie den Befehl "default", gefolgt vom Standardwert.
Beispiel:
public @interface CurrentWeatherCity {
String cityName() default "New York";
}
Diese Annotation kann wie folgt bezeichnet werden:
@CurrentWeatherCity
private String currentWeatherNewYork;
In diesem Fall wird der Standardwert "New York" verwendet.
Meta-Annotationen
Sie können die Einstellungen Ihres Annotationstyps mit dieser Art von Annotationen anpassen. Sie werden auf Ihrer erstellten Annotationsschnittstelle hinzugefügt.
Diese folgenden Meta-Annotationen sind verfügbar.
@Target
Dies definiert, wo Ihre Annotation verwendet werden kann. Zum Beispiel nur auf Konstruktoren, lokale Variablen usw.
Beispiel:
@Target( { FIELD, CONSTRUCTOR } )
public @interface CurrentWeatherCity {
}
In diesem Beispiel können Sie diese Anmerkung nur für statische ("static") (Klassen-)Variablen und Objektvariablen verwenden.
Alle verfügbaren Werte:
- ANNOTATION_TYPE - Only on other annotations
- ANNOTATION_TYPE - Nur bei anderen Anmerkungen
- TYPE - Nur bei allen Typdeklarationen. Klassen, Schnittstellen, Enums, etc.
- CONSTRUCTOR - Nur auf Konstruktoren
- METHODE - Nur bei statischen und nicht-statischen Methoden
- FIELD - Nur bei statischen Variablen und Objektvariablen
- PARAMETER - Nur bei Parametervariablen
- LOCAL_VARIABLE - Nur bei lokalen Variablen
- PACKAGE - Nur auf Package deklarationen (z.B.: "package com.mypackage")
Diese Werte sind in der Klasse "ElementType" definiert.
Ihre erstellten Annotationen können standardmäßig überall verwendet werden.
Wenn Sie nur einen Wert übergeben wollen, dann müssen Sie diese Annotation so aufrufen:
@Target( value = FIELD )
public @interface CurrentWeatherCity {
}
Oder so:
@Target( ElementType.FIELD )
public @interface CurrentWeatherCity {
}
Dies muss auch bei anderen Meta-Annotationen geschehen.
@Retention
Dies steuert, bis wann die Anmerkungen verfügbar sind. Die verfügbaren Werte gehören zur Klasse "java.lang.annotation.RetentionPolicy".
Beispiel:
@Retention( RetentionPolicy.RUNTIME )
public @interface CurrentWeatherCity {
}
In diesem Beispiel ist die Annotation überall und auch während der Laufzeit der Anwendung verfügbar.
Diese Werte sind verfügbar:
- SOURCE - Nur im Quellcode verfügbar und wird vom Compiler vor dem Kompiliervorgang verworfen.
- CLASS - Verfügbar in der Klassendatei. Sie ist aber nicht in der Laufzeitumgebung verfügbar.
- RUNTIME - Verfügbar in der Klassendatei und in der Laufzeitumgebung. Anmerkungen sind überall verfügbar.
Der Standardwert ist "CLASS".
@Documented
Dies bedeutet, dass diese Anmerkung in der Dokumentation "Javadoc" erwähnt wird. Anmerkungen sind standardmäßig nicht in der "Javadoc" enthalten.
Beispiel:
@Documented
public @interface CurrentWeatherCity {
}
@Inherited
Das bedeutet, dass die Annotation für eine Superklasse an die Subklasse vererbt werden kann.
Dies wird verwendet, wenn die Annotation für eine Klasse verwendet wird.
Wenn diese spezielle Anmerkung in der Subklasse angefordert wird und sie dort nicht vorhanden ist. Dann wird die Superklasse überprüft, und die Anmerkung der Superklasse wird zurückgegeben.
Beispiel:
@Inherited
@interface LoadWeather {
}
@LoadWeather
public class SimpleWeatherState {
}
@Repeatable
Dies bedeutet, dass die Annotation wiederholt werden kann. Sie können es ermöglichen, dass Ihre Annotation in einer bestimmten Klasse mehrfach auf dem gleichen Ziel (Objekt, Funktion usw.) verwendet werden kann.
Beispiel:
@Repeatable(MyJavaClass.class)
@interface CurrentWeatherCity {
String cityName() default "New York";
}
Diese Annotation kann so in der Klasse "MyJavaClass" wiederholt werden:
@CurrentWeatherCity(cityName="Seoul")
@CurrentWeatherCity(cityName="Vienna")
Dies war eine Einführung in die Erstellung Ihrer eigenen Anmerkungen und des Java-Pakets "java.lang.annotation".
Mehr über Java-Annotationen in Java 15:
https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/annotation/package-summary.html
Mehr über Java Annotations in Java 8:
https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/package-summary.html
https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Target.html