Was ist AspectJ?
AspectJ ist eine Erweiterung der Programmiersprache Java für die aspektorientierte Programmierung. Das Sprachmodell ergänzt objektorientierte Strukturen um Aspekte. Diese bündeln Funktionen, die sich sonst über zahlreiche Klassen und Methoden verteilen würden.
Typische Querschnittsaufgaben sind Protokollierung, Fehlerbehandlung, Transaktionssteuerung oder Authentifizierung. Sie gehören häufig nicht zur eigentlichen Fachlogik, betreffen aber viele Teile einer Software. AspectJ macht solche Aufgaben als eigenständige Module sichtbar.
Die Sprache entstand in den 1990er-Jahren in einem Forschungskontext und wurde später in das Eclipse-Umfeld integriert. Ihr prägender Ansatz ist das Weaving: Ein Weaver verbindet Aspekte mit dem regulären Java-Code.
Die zentralen Begriffe
Zum Verständnis von AspectJ sind fünf Konzepte wichtig. Sie beschreiben die Querschnittsfunktion, mögliche Eingriffspunkte und die dort ausgeführte Logik.
Aspect
Ein Aspekt kapselt eine Querschnittsfunktion einschließlich Auswahlregeln und auszuführendem Code.
Join Point
Ein Join Point ist ein definierter Punkt im Programmablauf, etwa ein Methodenaufruf oder die Ausführung eines Konstruktors.
Pointcut
Ein Pointcut wählt eine Menge passender Join Points aus. Muster können Methoden, Klassen oder Signaturen eingrenzen.
Advice
Ein Advice legt fest, welcher Java-Programmcode vor, nach oder anstelle eines ausgewählten Join Points läuft.
Inter-type Declaration
Damit lassen sich bestehende Klassen um Felder, Methoden oder Schnittstellenbeziehungen ergänzen.
Wie funktioniert das Weaving?
Beim Weaving wird der Advice an den durch Pointcuts bestimmten Join Points in die Anwendung integriert. Das kann während der Übersetzung, nach der Übersetzung vorhandener Klassen oder beim Laden von Klassen erfolgen. Das Ergebnis läuft auf einer geeigneten Java Runtime Environment.
Beim statischen Vorgehen verarbeitet der AspectJ-Compiler beziehungsweise Weaver Java-Klassen und Aspekte und erzeugt daraus verwobenen Bytecode. Der Aspekt muss anschließend nicht als eigenständiges Programm gestartet werden; seine Wirkung ist bereits Teil der Anwendung.
Load-Time Weaving verschiebt die Verbindung dagegen auf den Zeitpunkt, zu dem Klassen geladen werden. Die geeignete Variante hängt von Architektur, Build-Prozess, Laufzeitumgebung und Anforderungen an die Diagnose ab.
Pointcuts und Advice einordnen
Ein Pointcut kann sehr eng oder breit formuliert sein. Er kann beispielsweise den Aufruf bestimmter Methoden, alle Methoden einer Klasse oder Signaturen nach einem Muster erfassen. AspectJ unterstützt dafür unter anderem Wildcards und Pattern-Matching.
Ein Advice bestimmt anschließend den Zeitpunkt der Ausführung:
- before: Der Advice läuft vor dem ausgewählten Join Point.
- after: Der Advice läuft nach dem Join Point, gegebenenfalls abhängig von dessen Ergebnis.
- around: Der Advice umschließt den Join Point und kann dessen Ausführung steuern.
Diese Trennung ist entscheidend: Der Pointcut beantwortet die Frage „Wo?“, der Advice die Fragen „Was?“ und „Wann?“.
Bestandteile der Werkzeugkette
Zu einer AspectJ-Umgebung gehören im Kern ein Weaver beziehungsweise Compiler, die Laufzeitbibliothek und Werkzeuge für den Entwicklungsprozess. Der Compiler ajc übersetzt Java- und AspectJ-Quellen. Die Runtime-Bibliothek stellt die zur Ausführung benötigten Klassen bereit.
Entwicklungsumgebungen können AspectJ über ein Plugin integrieren. Hilfreich sind insbesondere:
- Anzeige der Verwebungspunkte im Quellcode,
- Navigation zwischen Advice und betroffenen Programmelementen,
- automatische Vervollständigung und Syntaxprüfung,
- Build-Konfiguration und Dokumentation,
- Unterstützung beim Debugging.
Moderne Sprachmittel wie generische und parametrisierte Typen sowie Annotationen können in Pointcuts und Aspekten berücksichtigt werden. Annotationen dienen dabei auch als zusätzliche Auswahlbedingung für Verwebungspunkte.
Vorteile und Grenzen
Vorteile
- Querschnittsfunktionen werden sichtbar modularisiert.
- Wiederholter Code kann reduziert werden.
- Fachlogik bleibt von technischen Aufgaben getrennt.
- Aspekte lassen sich an mehreren Stellen wiederverwenden.
Grenzen
- Breite Pointcuts können schwer nachvollziehbare Wirkungen haben.
- Änderungen an Klassen können Auswahlmuster unbeabsichtigt beeinflussen.
- Fehlersuche und Restrukturierung erfordern geeignete Werkzeuge.
- Die zusätzliche Syntax erhöht den Lernaufwand.
AspectJ ist besonders dann sinnvoll, wenn eine klar abgegrenzte technische Funktion viele Teile einer Anwendung betrifft. Für lokale, einmalige Aufgaben kann direkter Java-Code verständlicher sein. Pointcuts sollten möglichst präzise formuliert, dokumentiert und durch Tests abgesichert werden.
Alternative Implementierungen
Neben dem Standardwerkzeug ajc existiert der AspectBench Compiler, kurz abc. Er wurde als Forschungs- und Referenzprojekt konzipiert und diente auch als Framework für Spracherweiterungen. Solche Implementierungen sind vor allem für die Untersuchung und Weiterentwicklung aspektorientierter Sprachkonzepte relevant.