javaseiten.de   |   Version 0.6
 

2.3. Auslesen von Annotationen

Es besteht die Möglichkeit die in einem Java-Programm verwendeten Annotationen zur Laufzeit wieder auszulesen. Dazu spielt das Interface AnnotatedElement eine wesentliche Rolle. Das Interface deklariert folgende Methoden (abstrakte Methoden, die keine Implementierung besitzen):

java.lang.reflect 
Interface AnnotatedElement
1.5

Methode:
  Annotation[] getAnnotations()
  Annotation[] getDeclaredAnnotations()
  boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

Das Interface wird u.a. von den Klassen Class und Method implementiert, die sich in den unterschiedlichen Paketen java.lang und java.lang.reflect befinden. In diesen Klassen werden die Methoden des Interfaces konkret implementiert. Folgende Programmzeilen können verwendet werden, um die möglicherweise vorhandenen Annotationen von Methoden auszulesen (Ausschnitt aus Listing 2.3):

Method[] m = null;
try {
  m = Class.forName("AnnotationExample").getMethods();
} catch (ClassNotFoundException e) {
  System.out.println(e.toString()); 
}  
for (int i = 0; i < m.length; i++) {
  Annotation[] anno = m[i].getAnnotations();
  if (anno.length != 0) {
    System.out.print(m[i].getName() + ": ");
    for (int j = 0; j < anno.length; j++) {
      System.out.print(anno[j].toString() + " ");
    }
    System.out.println();
  }  
}

Zunächst werden die Methoden der Klasse AnnotationExample beschafft und in einem Method-Array abgespeichert. Die Methode getAnnotations gibt im vorgestellten Code, für jedes Element dieses Arrays, alle verfügbaren Annotationen zurück. Die Verwendung von getDeclaredAnnotations würde nur die "direkt" verfügbaren Annotationen eines Programmelements zurückgeben, denn alle geerbten Annotationen würden ignoriert werden (Stichwort: Meta-Annotation @Inherited). Soll z.B. überprüft werden ob bei einer Methodendeklaration die Annotation @TestElement verwendet wurde, kann dies mit isAnnotationPresent(TestElement.class) geschehen. Das folgende kurze Beispiellisting verwendet @Autor und @TestElement bei der Deklaration von Methoden. Diese Annotationen der Methoden werden anschließend ausgelesen und eine entsprechende Ausgabe wird erzeugt.

Listing 2.3. AnnotationExample.java. Verwenden von eigenen Annotationstypen. Auslesen von Annotationen.

/* 
 * AnnotationExample.java 
 * JDK 5
 * benoetigte Dateien: Autor.java, TestElement.java
 *
 */

import java.lang.annotation.*;
import java.lang.reflect.*;

public class AnnotationExample {
  
  @Autor(id = 1, name = "im Glueck", vorname = "Hans")
  public static void methodeVonHansImGlueck() {
    System.out.println("Hans im Glueck");
  }
  
  @Autor(id = 2, name = "Dampf", vorname = "Hans") @TestElement
  public static void methodeVonHansDampf() {
    System.out.println("Hans Dampf");
  }
  
  @TestElement public static void methodeTest() {
    System.out.println("Testmethode!");
  }
  
    
  public static void main(String[] args) {
    Method[] m = null;
    try {
      m = Class.forName("AnnotationExample").getMethods();
    } catch (ClassNotFoundException e) {
      System.out.println(e.toString()); 
    }  
    
    // alle Annotationen ausgeben
    for (int i = 0; i < m.length; i++) {
      Annotation[] anno = m[i].getAnnotations();
      if (anno.length != 0) {
        System.out.print(m[i].getName() + ": ");
        for (int j = 0; j < anno.length; j++) {
          System.out.print(anno[j].toString() + " ");
        }
        System.out.println();
      }  
    }
    System.out.println();
    
    // suchen von Methoden mit bestimmten Annotationen
    System.out.print("Methoden, die mit @TestElement gekennzeichnet sind: ");
    for (int i = 0; i < m.length; i++) {
      if (m[i].isAnnotationPresent(TestElement.class)) {
        System.out.print(m[i].getName() + " ");
      }
    }  
    System.out.println();
        
  }  
}

Die Ausgabe des Listings lautet wie folgt:

methodeVonHansImGlueck: @Autor(id=1, name=im Glueck, vorname=Hans)
methodeVonHansDampf: @Autor(id=2, name=Dampf, vorname=Hans) @TestElement()
methodeTest: @TestElement()

Methoden, die mit @TestElement gekennzeichnet sind:
methodeVonHansDampf methodeTest

 

 

 

Diese Seite nutzt Google-Dienste - siehe dazu Datenschutz.

Copyright © 2006, 2007 Harald Roeder