© Excellent backgrounds/Shutterstock.com
Nur eine Zeile Code …

Kolumne: EnterpriseTales


Eine Annotation, wie z. B. @Transactional, ist während der Entwicklung (in der Regel) nur eine Zeile Code. In Enterprise Java (sei es JEE oder Spring) löst diese eine Zeile Code aber häufig viel Magie aus, die im Hintergrund passiert, wenn das Programm gestartet wird. Welche Auswirkungen hat das aber auf die Entwicklungsperformance? Wie kriegt man es hin, dass der lokale Entwicklungsserver einen Live Reload durchführt, ohne dass man lange Zeit auf das Rekompilieren und Neustarten der Applikation warten muss?

Annotations sind aus der Enterprise-Java-Entwicklung nicht mehr wegzudenken. Damit eine Annotation, die ich an eine Java-Klasse, ein Feld oder eine Methode schreibe, überhaupt eine Auswirkung hat und nicht nur schmückendes Beiwerk zu meinem Code ist, muss es etwas geben, das diese Annotation auswertet. Das passiert durch Metaprogrammierung [1].

Metaprogrammierung – die Grundlagen

Ganz allgemein ist Metaprogrammierung der Entwurf von Programmen, die andere Programme als ihre Daten behandeln. Im Grunde entwirft man ein Metaprogramm, das ein sogenanntes Objektprogramm inspiziert und/oder verändert. Das heißt, ein Metaprogramm untersucht bestehende Codefragmente (z. B. um Annotations zu finden), verändert diese und erzeugt ggf. neue, eigene Codefragmente.

Das klingt zunächst kompliziert, erweist sich bei näherem Hinsehen aber als alltäglicher Vorgang. Metaprogrammierung wird von den Enterprise-Java-Technologien wie Spring oder Java EE schon seit vielen Jahren genutzt. Es ist nämlich genau der Mechanismus, der dafür sorgt, dass ein Feld tatsächlich befüllt wird, wenn wir @Inject dranschreiben, oder dass eine Transaktion gestartet und später committet wird, wenn wir @ Transactional an eine Methode anfügen.

Technisch verwenden die Frameworks dafür Reflection als Werkzeug. Mit Reflection können zum Beispiel private Felder ausgelesen und verändert, private Methoden aufrufbar gemacht werden usw.

Metaprogrammierung wird unter anderem unterteilt in statische und dynamische Metaprogrammierung. Sie unterscheiden sich nur darin, wann die Metaprogrammierung durchgeführt wird. Werden die Metaprogramme zur Kompilierzeit oder erst zur Start-up- oder Laufzeit ausgeführt?

Auch wenn „dynamisch“ im ersten Moment besser klingt, da das Wort „statisch“ immer viele negative Konnotationen hat, wird dynamische Metaprogrammierung im Gegensatz zur statischen erst zur Start-up- oder Laufzeit durchgeführt. Das führt dazu, dass solche Programme lange brauchen, bis sie deployt/hochgefa...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang