Kapitel 21 Reflection und Annotationen
Aber wofür soll das gut sein?
– Advanced Computing Systems Division von IBM, 1968, zum Microchip
Das Reflection-Modell erlaubt es uns, Klassen und Objekte, die zur Laufzeit von der JVM im Speicher gehalten werden, zu untersuchen und in begrenztem Umfang zu modifizieren. Das Konzept der Reflection (oder auch Introspektion) wird besonders interessant, wenn wir uns näher mit Java-Beans beschäftigen oder Hilfsprogramme zum Debuggen oder GUI-Builder schreiben. Diese Programme heißen auch Meta-Programme, da sie auf den Klassen und Objekten anderer Programme operieren. Reflection fällt daher auch in die Schlagwortkategorie »Meta-Programming«.
21.1 Metadaten
 
Ein Metadatum ist eine Information über eine Information. In Java beschreibt ein Class-Objekt, was Klassen »können«, also welche Methoden sie haben und welche Attribute sie besitzen.
Lange gibt es javaDoc-Tags, die ebenfalls Metadaten sind. So ist im folgenden Beispiel die Methode veraltet, weil das javaDoc-Tag @deprecated gesetzt ist.
/**
* Sets the day of the month of this <tt>Date</tt>
object to the specified value. ....
* @deprecated As of JDK version 1.1, replaced by ....
*/
@Deprecated
public void setDate( int date ) {
getCalendarDate().setDayOfMonth( date );
}
In diesem Fall gilt das javaDoc-Tag für genau eine Methode, die dann als annotiert gilt. Die Beschreibungen können aber noch weiter gehen und müssen nicht nur auf Methodenebene bleiben. So annotiert das Tag @author den Autor und damit gleich eine ganze Klasse oder Schnittstelle.
Um die in Kommentaren eingesetzten javaDoc-Tags muss sich der Java-Compiler nicht kümmern, obwohl er @deprecated eine Ausnahme zugesteht. Es ist Aufgabe des externen Programms javadoc – eines so genannten Doclets –, aus diesen Kommentaren etwas zu machen, etwa eine Sammlung von verknüpften HTML-Dokumenten.
21.1.1 XDoclet
 
javaDoc-Tags haben sich in den letzten Jahren als sehr flexibel erwiesen. Zwar belegt Sun einige Tags mit bestimmten Bedeutungen (@see, @autor, …) doch können Tags in den Dokumentations-Kommentaren im Prinzip frei gewählt werden. Ein Doclet muss nicht nur HTML generieren, sondern könnte ebenso neue Quellcode- oder XML-Dateien erzeugen, oder Tests durchführen, ob Methodennamen gut gewählt sind.
Zu Nutze macht sich das etwa das Programm XDoclet (http://xdoclet.sourceforge.net/). Es generiert aus javaDoc-Tags Schnittstellen, Hilfsklassen, Deskriptoren und mehr. Häufig anzutreffen ist es bei Enterprise Java Bean, aber auch bei OR-Mapping oder Servlets. Eine Session-Bean ist nach der Java Enterprise Edition 1.4 in wenigen Zeilen definiert:
import javax.ejb.SessionBean;
/**
* @ejb.bean name = "Hallo"
* type = "Stateless"
*
**/
public abstract class HalloBean implements SessionBean
{
/**
* @ejb.interface-method
*/
public String hallo( String name ) {
return "Hallo " + name;
}
}
Ein Ant-Tag nimmt den so annotierten Quellcode und generiert über ein Doclet alle für die Enterprise JavaBeans nötigen Dateien.
|