AspectJ

Bei AspectJ handelt es sich um eine Erweiterung der Programmiersprache Java um spezielle Konstrukte zur aspektorientierten Programmierung (AOP). AspectJ wurde bereits 1996 von einem Team am Xerox Palo Alto Research Center - maßgeblich beeinflusst von Georg Kiczales - entwickelt. AspectJ ist seit dem Jahr 2002 auch Teil des Eclipse Projekts, welches aktuelle Development Tools zur Verfügung stellt. Mit Einführung der AOP wird Java nur um eine bestimmte Klasse Aspect ergänzt, die die AOP-spezifischen Methoden kapselt. Der funktionale Java-Programm-Code wird an den zuvor definierten Verwebungspunkten mit einem Aspekt verwoben. Für die Ausführung von AspectJ-Programmcode werden neben dem Java Runtime Environment (JRE) ein entsprechender Compiler - auch Weaver genannt - und die AspectJ Runtime Library benötigt. Ein Aspect ist dadurch beim Start eines Programms bereits gegenwärtig, da er durch den Weaver in den vorhandenen Code eingewebt wurde, und somit physischer Teil der Anwendung ist und braucht daher auch nicht separat gestartet zu werden.

AspectJ war die erste aspektorientierte Programmiersprache, und da sie zudem noch auf der weit verbreiteten Programmiersprache Java basiert, besitzt auch AspectJ ebenso eine weite Verbreitung sowie eine hohe Akzeptanz.

Für eine verständliche Erläuterung von AspectJ, müssen zunächst die folgenden Begriffe erläutert werden.

Aspekt. Aspekte implementieren sogenannte Crosscutting Concerns - auch Querschnittsfunktionalitäten genannt. Damit ist eine generelle Funktion wie Logging, Authentifizierung etc. gemeint.

Join Point. Mit Join Point wird die Stelle innerhalb einer Software bezeichnet, an denen sich der AspectJ-Code in den Programmfluss einklinken soll. Join Points können Ausführungen von Methoden sein, die Ausführung sowie der Aufruf eines Konstruktors oder die Referenz auf Datenstrukturen (Variablen).

Point Cut. Als Point Cut wird eine Menge von Join Points - auch Verwebungspunkte genannt- bezeichnet. Diese Menge kann leer sein oder einen, mehrere oder alle Join Points enthalten.

Advice. Dies ist ein spezifischer Begriff von AspectJ und definiert, was zu welchem Zeitpunkt an den Join Points eines Point Cuts umgesetzt wird. Advices bestehen aus ganz normalem Java Programmcode. Für den Zeitpunkt des Einfügens des AspectJ-Codes können festgelegt werden: before, after und around.

Inter Type Declaration. Mit Anwendung der AOP ist eine dynamische Erweiterung von Klassen möglich, was als Inter Type Declaration bezeichnet wird.

Aspekte, 
   Point Cuts und Join Point

Aspekte, Point Cuts und Join Point

Die Abbildung verdeutlicht den Zusammenhang zwischen Aspekten, Point Cuts und Join Points. Dort ist der Join Point eine im Programmablauf fest definierte Stelle, die den Aspekt- und den nicht-aspektorientierten Code koordiniert.

Die aspektorientierte Programmierung erweitert die vorhandenen Java-Klassen um eine einzige spezielle Klasse Aspect, die dann ihre eigenen Datenstrukturen und Methoden kapselt. Ein zentrales Element dabei sind die Point Cuts, die u.a. aus den o.g. Methoden aufgebaut sein bzw. noch durch eine Reihe weiterer Auswahlmethoden gebildet werden können. Von AspectJ wird zur Laufzeit in die Struktur der Klassen einer Anwendung eingegriffen, ohne dass die Anwendung speziell vom Vorhandensein der Aspekt-Klasse Kenntnis hat. Da AspectJ u.a. die Verwendung von Wildcards hinsichtlich der Auswahl der Klassen, Methoden u.a. durch Pattern-Matching gestattet, muss auch der Aspekt von der Klasse nichts wissen, auf welche er letztendlich zugreift. Die Umsetzung eines Aspektes - das Einweben eines Aspektes in den Java-Programmcode - erfolgt dann entweder mit der Compilierung oder zur Laufzeit, was dann Auswirkungen auf die Performance einer Anwendung hat.

AspectJ unterstützt generische und parametrisierte Typen in pointcuts, intertype declarations sowie bei der Vererbung. Seit der Version 5 von AspectJ können Features wie Annotations, Generics, Autoboxing und Unboxing verwendet werden. Annotationen können Aspekte und innerhalb von Aspekten Methoden, Felder, Konstruktoren, Advices etc. mit Metadaten kennzeichnen. Annotationen können auch in Pointcuts als zusätzliche Bedingungen für Verwebungspunkte angegeben werden.

Darstellung der Notationen von AspectJ

Darstellung der Notationen von AspectJ

Nachfolgend ein Beispiel zur Darstellung der Notation von AspectJ. Dabei definiert der Aspekt Trace einen pointcut für den Aufruf aller Methoden mit add mit beliebigen Argumenten sowie beliebigem Rückgabewert. Zudem werden von Trace zwei Advices definiert.

Für die Arbeit mit AspectJ sind grundsätzliche folgende Komponenten in einem Paket zusammengefasst:

  • Der AspectJ Compiler (Weaver) ajc.
  • Der AspectJ Interpreter aj.
  • Die AspectJ Runtime Library ASPECTJRT_LIB.

Die Verwebung einer Java-Klasse mit einem Aspekt erfolgt statisch auf Basis des Quellcodes mit Hilfe des Compilers ajc. Dazu werden von ajc zunächst die Java-Klassen und die Aspekte compiliert und diese dann auf Basis des so generierten Bytecodes verwoben. Um dann die so entstandene Anwendung zu nutzen, genügt dann das bekannt Java Runtime Environment (JRE).

Zu den Vorteilen von AspectJ zählen eine bessere Modularisierung der Anwendung, die Möglichkeit der Wiederverwendung von Code und es kann sehr flexibel genutzt werden, da schnell und ohne Verluste von Performance zwischen Java- und AspectJ-Code umzuschalten ist.

Denen stehen die folgenden Nachteile gegenüber: Die Definition von Point Cuts setzt eine uneingeschränkte Kenntnis der Anwendungsklassen voraus, AspectJ-Code ist nicht automatisch restrukturierbar, die Erstellung eines Point Cuts mit zugehörigem Advice ist häufig aufwendiger als direkter Java-Code, die Nutzung von AspectJ setzt bei komplexeren Projekten eine spezielle Entwicklungsumgebung voraus und die Syntax von AspectJ weicht teilweise erheblich von der Java-Syntax ab.

AspectJ unterliegt einer ständigen weiteren Entwicklung und wird von einer Reihe von Entwicklungsumgebungen wie Emacs, JBuilder und Netbeans unterstützt. Außerdem natürlich von Eclipse, bei dem sowohl eine AspectJ-Projekt und ein separates AspectJ Development Tools-Projekt läuft. Letzteres entwickelt für AspectJ Eclipse Plugins. Durch die Integration als Plugin in die Entwicklungsumgebung Eclipse ist ein spezieller Editor für AspectJ verfügbar sowie eine Reihe weiterer Funktionen:

  • Automatische Generierung von AspectJ-Dokumentation.
  • Die Verwebungspunkte werden im Quellcode angezeigt.
  • Durch einen Wizard gesteuert, können Aspekte konfiguriert werden.
  • Build-Dateien können bearbeitet und verwaltet werden.
  • Das Debugging kann auf grafischem Wege erfolgen.
  • Der Quellcode wird automatisch vervollständigt.

Eine weitere Implementierung von AspectJ ist der AspectBench Compiler (auch abc genannt), der sowohl ein Referenz-Compiler zu ajc ist, als auch als ein ergänzendes Framework zur Implementierung von Erweiterungen zu AspectJ. Diesbezüglich hat abc auch die Optimierung des Sprachkerns von AspectJ zum Ziel. Dabei handelt es sich bei abc um ein universitäres Projekt aus den USA, Kanada und Dänemark. Dazu baut abc auf den beiden eigenständigen Frameworks Polyglot und Soot auf. Zudem wurde die komplette Laufzeit-Bilbiothek aus ajc entnommen. Ein wesentlicher Unterschied ist, dass das Compilieren von Aspekten nicht separat unterstützt wird.

Informationen zum Artikel
Deutsch: AspectJ
Englisch:
Veröffentlicht: 13.04.2010
Wörter: 1052
Tags: #Java
Links: Ablaufverfolgung, Annotation, Aspekt, Aspektorientierte Programmierung, Authentifizierung
1