2.2. Definition von Annotationstypen
Die Deklaration eines Annotationstyps ist ähnlich der einer Interface-Deklaration.
Zur Kennzeichnung einer Annotationstyp-Deklaration wird dem Schlüsselwort
interface ein "@"-Zeichen vorangestellt. Als Beispiel soll der
Annotationstyp Autor definiert werden, dabei werden die vordefinierten
Meta-Annotationen @Documented, @Retention und
@Target verwendet (siehe auch Abschnitt 2.4).
Für die Definition wird eine Java-Quelltextdatei wie folgt erstellt:
Listing 2.1. Autor.java. Definition des Annotationstyps Autor.
import java.lang.annotation.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Autor {
int id();
String name();
String vorname();
}
Die Elemente des Annotationstyps Autor sind id,
name und vorname. Ein Annotationstyp-Element kann mit
Hilfe des Schlüsselwortes default mit einem Vorgabewert versehen
werden. Die folgenden Zeilen würden für alle drei Elemente einen Vorgabewert
festlegen:
int id() default 1;
String name() default "im Glueck";
String vorname() default "Hans";
Falls der Annotationtyp Autor mit den drei Default-Werten
definiert wäre, wären die Annotationensangaben @Autor oder
@Autor(id = 2, name = "Dampf") innerhalb eines Quellprogramms
zulässig. Die in der Annotation nicht aufgeführten Element-Wert-Paare werden
ergänzt und dabei wird der jeweilige Vorgabewert verwendet. An dieser Stelle
soll noch kurz die zu Autor.java gehörende API-Dokumentation betrachtet
werden. Sie kann mit der folgender Anweisung generiert werden:
> javadoc Autor.java
Ein Ausschnitt aus den erzeugten HTML-Dateien zeigt, dass die bei der Deklaration verwendeten Meta-Annotationen und die
Elemente des Annotationstyps aufgeführt sind.
Zunächst soll noch der weitere Annotationtyp (Marker-Annotationstyp)
TestElement definiert werden, der später in einem Beispiellisting
verwendet werden soll, um Methoden zu kennzeichnen.
Listing 2.2. TestElement.java. Definition des Annotationstyps
TestElement.
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TestElement { }