17Typen, Reflection und Annotationen
»Aber wofür soll das gut sein?«
– Advanced Computing Systems Division von IBM zum Microchip, 1968
Zentral beim Java-Laufzeitsystem ist die Idee, Klassen zur Laufzeit zu laden. Einmal geladene Klassen können erfragt werden über Reflection; das erlaubt 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) ist besonders bei JavaBeans oder Hilfsprogrammen zum Debuggen oder bei GUI-Buildern interessant. Diese Programme heißen auch Metaprogramme, da sie auf den Klassen und Objekten anderer Programme operieren. Reflection fällt daher auch in die Schlagwortkategorie Meta-Programming.
17.1Metadaten
Ein Metadatum ist eine Information über eine Information. In Java beschreibt ein Class-Objekt, was Typen wie Klassen so »können«, also welche Konstruktoren und Methoden sie haben, welche Attribute sie besitzen und wie die Erweiterungsbeziehungen sind.
17.1.1Metadaten durch Javadoc-Tags
Seit den ersten Java-Versionen gibt es die Javadoc-Tags, die besondere Metadaten darstellen. 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 Dienstprogramms javadoc und einem so genannten Doclets aus diesen Kommentaren etwas zu machen, etwa eine Sammlung von verknüpften HTML-Dokumenten.