Java Annotation Types: Umfassender Leitfaden zu vordefinierten, benutzerdefinierten und Meta-Annotations
Java Annotation Types
Dieses Tutorial behandelt Java Annotations – vordefinierte, benutzerdefinierte und Meta-Annotations – mit klaren Beispielen.
Java Annotations sind Metadaten, die Elemente in Ihrem Quellcode beschreiben. Die Java SE Plattform liefert einen Satz Standard-Annotations, und Entwickler können benutzerdefinierte für ihre Projekte erstellen. Annotations können auch selbst annotiert werden, was als Meta-Annotations bekannt ist.
Annotations fallen in drei Kategorien:
- Vordefinierte Annotations – in die Java-Plattform eingebaut.
- Benutzerdefinierte Annotations – benutzerdefiniert für spezifische Bedürfnisse.
- Meta-Annotations – Annotations, die auf andere Annotations angewendet werden.
Vordefinierte Annotation Types
1. @Deprecated
Der @Deprecated-Marker signalisiert, dass eine Klasse, Methode, Feld oder ein anderes Element veraltet ist und eine neuere Alternative hat. Der Compiler gibt eine Warnung aus, wann immer ein veraltetes Element verwendet wird.
Syntax:
@Deprecated public void alteMethode() { ... }
Javadoc stellt das @deprecated-Tag für Dokumentation bereit:
/** * @deprecated * Verwenden Sie {@link #neueMethode()} stattdessen. */ @Deprecated public void alteMethode() { ... }
Beispiel
class Haupt { /** * @deprecated * Diese Methode ist veraltet und wurde durch neueMethode() ersetzt */ @Deprecated public static void veralteteMethode() { System.out.println("Veraltete Methode"); } public static void main(String[] args) { veralteteMethode(); } }
Ausgabe:
Veraltete Methode
2. @Override
Die @Override-Annotation zeigt an, dass eine Methode eine Methode von einer Oberklasse oder Schnittstelle überschreiben soll. Zwar nicht zwingend, fängt sie Fehler wie nicht übereinstimmende Signaturen zur Kompilierzeit ab.
Beispiel
class Tier { public void anzeigen() { System.out.println("Ich bin ein Tier"); } } class Hund extends Tier { @Override public void anzeigen() { System.out.println("Ich bin ein Hund"); } public void nachrichtDrucken() { anzeigen(); } } class Haupt { public static void main(String[] args) { Hund hund1 = new Hund(); hund1.nachrichtDrucken(); } }
Ausgabe:
Ich bin ein Hund
3. @SuppressWarnings
Diese Annotation weist den Compiler an, bestimmte Warnkategorien zu ignorieren. Gängige Kategorien sind deprecation und unchecked.
Verwendung:
@SuppressWarnings("deprecation")
Mehrere Kategorien:
@SuppressWarnings({"deprecation", "unchecked"})
Beispiel
class Haupt { @Deprecated public static void veralteteMethode() { System.out.println("Veraltete Methode"); } @SuppressWarnings("deprecation") public static void main(String[] args) { Haupt depObj = new Haupt(); depObj.veralteteMethode(); } }
Ausgabe:
Veraltete Methode
4. @SafeVarargs
Auf final, static oder private Methoden und Konstruktoren angewendet, behauptet @SafeVarargs, dass die Methode keine unsicheren Operationen an ihrem Varargs-Parameter durchführt. Dies entfernt unchecked Warnungen im Zusammenhang mit Varargs.
Beispiel
import java.util.*; class Haupt { @SafeVarargs private static void listenAnzeigen(List<String>... listen) { for (List<String> liste : listen) { System.out.println(liste); } } public static void main(String[] args) { List<String> uniListe = Arrays.asList("Tribhuvan Universität", "Kathmandu Universität"); List<String> progSprachen = Arrays.asList("Java", "C"); listenAnzeigen(uniListe, progSprachen); } }
Ausgabe
[Tribhuvan Universität, Kathmandu Universität] [Java, C]
5. @FunctionalInterface
Eingeführt in Java 8, bezeichnet diese Annotation ein Interface als Functional Interface – ein Interface mit einer einzelnen abstrakten Methode. Der Compiler prüft diese Constraint.
Beispiel
@FunctionalInterface public interface MeinFuncInterface { void ersteMethode(); // abstrakt }
Das Hinzufügen einer zweiten abstrakten Methode löst einen Kompilierfehler aus:
@FunctionalInterface public interface MeinFuncInterface { void ersteMethode(); void zweiteMethode(); // Kompilierzeit-Fehler }
Mehrere default oder static Methoden sind erlaubt.
@FunctionalInterface public interface MeinFuncInterface { void ersteMethode(); default void zweiteMethode() { /* ... */ } default void dritteMethode() { /* ... */ } }
Benutzerdefinierte Annotations
Entwickler können Annotations erstellen, die anwendungsspezifische Anforderungen erfüllen. Die Syntax nutzt @interface und kann Element-Methoden mit optionalen Default-Werten enthalten.
Syntax
@interface AnnotationName { ElementType elementName() default defaultValue; }
Beispiel
@interface MeineBenutzerdefinierteAnnotation { String value() default "Standardwert"; } class Haupt { @MeineBenutzerdefinierteAnnotation(value = "programiz") public void methode1() { System.out.println("Test Methode 1"); } public static void main(String[] args) { new Haupt().methode1(); } }
Ausgabe
Test Methode 1
Meta Annotations
Meta-Annotations konfigurieren, wie sich andere Annotations verhalten.
1. @Retention
Definiert den Geltungsbereich der Sichtbarkeit einer Annotation: SOURCE, CLASS oder RUNTIME.
@Retention(RetentionPolicy.RUNTIME) public @interface MeineAnnotation { }
2. @Documented
Stellt sicher, dass die Annotation im generierten Javadoc erscheint.
@Documented public @interface MeineAnnotation { }
3. @Target
Beschränkt die Annotation auf bestimmte Programmelemente.
@Target(ElementType.METHOD) public @interface MeineAnnotation { }
Elementtypen umfassen ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE.
4. @Inherited
Ermöglicht einer Unterklasse, eine auf einer Oberklasse vorhandene Annotation zu erben.
@Inherited public @interface MeineAnnotation { }
5. @Repeatable
Erlaubt, eine Annotation mehrmals auf demselben Element anzuwenden. Erfordert eine Container-Annotation.
@Repeatable(Universitaeten.class) public @interface Universitaet { String name(); } public @interface Universitaeten { Universitaet[] value(); }
Verwendung:
@Universitaet(name = "TU") @Universitaet(name = "KU") private String uniName;
Um Annotationsdaten zur Laufzeit zuzugreifen, nutzen Sie die Reflection API's getAnnotationsByType() oder getAnnotations() Methoden.
Java
- Java Primitive Datentypen: Vollständiger Leitfaden mit Beispielen
- Java Operatoren meistern: Typen, Syntax und praktische Beispiele
- Java-Schnittstellen meistern: Konzepte, Implementierung und Best Practices
- Java Try-With-Resources meistern: Automatisches Ressourcenmanagement erklärt
- Java Annotations erklärt: Typen, Platzierung und praktische Beispiele
- Java Annotation Types: Umfassender Leitfaden zu vordefinierten, benutzerdefinierten und Meta-Annotations
- Java String.charAt(): Syntax, Rückgabetyp, Exceptions und praktisches Beispiel
- Java String.endsWith(): String-Suffixe prüfen mit Beispielen
- Java String-Ersetzung meistern: replace(), replaceAll() und replaceFirst() erklärt
- Java Variablentypen verstehen: Ein umfassender Leitfaden