Softwareentwicklung · Java

AspectJ

AspectJ erweitert Java um Sprachmittel für aspektorientierte Programmierung. Querschnittsaufgaben wie Protokollierung oder Authentifizierung lassen sich dadurch getrennt vom fachlichen Programmcode formulieren und gezielt einweben.

GrundlagenartikelLesedauer: ca. 8 Minuten
Java-Programmcode auf einem Bildschirm zur Erklärung von AspectJ bei IT Wissen

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.

KurzdefinitionAspectJ beschreibt, an welchen Stellen eines Java-Programms zusätzlicher Code wirksam wird, was dort ausgeführt wird und wie dieser Code in die Anwendung eingewoben wird.

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.

Java-Code
Aspect und Pointcuts
Verwobener Bytecode
Vereinfachtes Modell: Der Weaver kombiniert regulären Code und Aspekte zu ausführbarem Java-Bytecode.

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.

Häufige Fragen zu AspectJ

Kurze Antworten zu Einsatz, Ausführung und Abgrenzung.

Ist AspectJ eine eigenständige Programmiersprache?

AspectJ ist eine Erweiterung von Java. Es übernimmt die Java-Grundlagen und ergänzt Konstrukte für Aspekte, Pointcuts, Advice und Inter-type Declarations.

Was ist der Unterschied zwischen Join Point und Pointcut?

Ein Join Point ist ein möglicher Punkt im Programmablauf. Ein Pointcut ist eine Auswahlregel, die einen oder mehrere dieser Punkte bestimmt.

Muss ein Aspect separat gestartet werden?

Nein. Durch das Weaving wird seine Logik in die Anwendung integriert. Je nach Verfahren geschieht das beim Übersetzen, nachträglich am Bytecode oder beim Laden von Klassen.

Wofür eignet sich AspectJ besonders?

Es eignet sich für klar abgegrenzte Querschnittsaufgaben, die an vielen Stellen benötigt werden, etwa Protokollierung, Zugriffskontrolle oder technische Überwachung.

Welche Risiken haben zu breite Pointcuts?

Sie können mehr Join Points erfassen als beabsichtigt. Dadurch werden Programmwirkungen schwerer erkennbar und Änderungen an Klassen können unerwartete Folgen haben.

Was benötigt eine AspectJ-Anwendung zur Ausführung?

Die konkrete Ausstattung hängt vom Weaving-Verfahren ab. Üblicherweise werden eine passende Java-Laufzeit und die AspectJ-Runtime-Bibliothek benötigt; für Übersetzung oder Weaving kommt der entsprechende Compiler hinzu.