Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid AOP mit AspectJ.

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

Objektorientierte Programmierung
der Universität Oldenburg
Objektorientierte Programmierung
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
FH-Hof Fehlerbehandlung Richard Göbel. FH-Hof Konzept Fehler können mit dem Operator throw einer übergeordneten Funktion signalisiert werden. Parameter.
Ein Beispiel in Java.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Objekte werden als Adressen (Referenzen) übergeben. Dies führt manchmal zu unerwarteten Ergebnissen...
Assoziationen (Beziehungen). Zwischen Objekten kann es eine Beziehung geben.
Objekte und Arbeitsspeicher
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
Einführung in die Programmierung mit Java
Programmieren mit JAVA
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: Benutztes Objekt kennt den Kontext seiner Nutzung nicht. Daher kann es in besonderen Situationen keine Entscheidung.
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
Zusammenfassung Vorwoche
AspectJ – Eine Aspektorientierte Programmiersprache
Die Skriptsprache Perl (8) Wolfgang Friebel DESY Zeuthen.
Packages Vortrag : Cornelia Hardt 23. November 1999.
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Einführung in Java1 Einführung in JAVA.
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
05 - Reflection Das Reflection API Reflection2 Ziel Es kommt vor, dass eine Methode ein Objekt als Parameter übergeben bekommt, ohne dass bekannt.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Grundlagen der Programmierung
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Parameterübergabemechanismen für den Methodenaufruf
Objectives Verstehen was unterDelegate verstanden wird
EPROG Tutorium #6 Philipp Effenberger
EPROG Tutorium #3 Philipp Effenberger
Learning By Doing Ausnahmebehandlung Exceptions (Ausnahmebehandlung) Typische Fehlverhalten zur Laufzeit: s. Buch S. 287ff -Verwendung von null-Objekten.
Programmiervorkurs WS 2014/15 Methoden
Programmiervorkurs WS 2014/15 Instanzmethoden
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Informatik I : Software höhere Programmiersprachen Java Klassen: hat Methoden (Funktionen) und Daten (Variablen) es kann mehrere Klassen geben nur eine.
AOP Lösung für Querschnittsaufgaben. Was ist AOP ? AOP ist kein Ersatz für OOP AOP ergänzt OOP AOP beinhaltet die Behandlung von Querschnittsaufgaben.
Robuste Programme durch Ausnahmebehandlung
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Einführung in die Programmierung mit Java
Java-Kurs Übung Besprechung der Hausaufgabe
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Gerhard Gröger Einführung in die Programmierung mit Java 5. Vorlesung WS 2002/2003.
Einführung in die Programmierung mit Java 5. Vorlesung WS 2002/2003 Institut für Kartographie und Geoinformation Prof.-Dr. Lutz Plümer, Dr. Gerhard Gröger,
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 7. Vorlesung WS 2002/2003.
Abstrakte Klassen und das Interface-Konzept
Java Programme nur ein bisschen objektorientiert.
Vortrag Einführung in AspectJ. Gliederung 1 Einleitung 2 Querschnittsfunktionalitäten in AspectJ 2.1 Sprachelemente 3 Beispiel 4 Join Point Modell 5 Weaving.
Protokollieren, überwachen und verfolgen Vortrag zum Seminar „Aspektorientierte Programmierung“ von Andre Kaplick - 6. Juni 2016.
C++ FÜR cOMPUTERSPIELENTWICKLER
Tutorium Software-Engineering SS14 Florian Manghofer.
Einführung in AspectJ ● Inhalt: 1)Überblick 2)Elemente des crosscuttings in AspectJ 3)„Hello World“ in AspectJ 4)Wie Aspekte in Java verwoben werden 5)Join.
Konstruktoren.
Implementieren von Klassen
 Präsentation transkript:

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid AOP mit AspectJ

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Inhalt Übersicht  Einführung in AOP  AOP mit AspectJ Kurzübersicht AspectJ  Wie identifiziert AspectJ Stellen im Programmfluss?  Wie definiert man, was an diesen Stellen passiert?  Das neue Modul für crosscutting concerns: aspect Vertiefung in AspectJ  Pointcut  Advice  Aspect  Kontext eines joinpoints an den advice weiterreichen

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Module beim Software Entwurf Anforderungen werden definiert und einem Modul zugeordnet Module kommunizieren über eine definierte Schnittstelle Die Abhängigkeiten, die dabei entstehen, sollten gering gehalten werden Gängige Techniken wie Prozedurale Programmierung, OOP und Design Patterns helfen bei dieser Art von Modularisierung Modul 3Modul 4 Modul 2 Modul 1

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Module mit systemweiten Abhängig- keiten („crosscutting concerns“) Es gibt Anforderungen, die es nötig machen aus sehr vielen Modulen auf ein anderes Modul zuzugreifen. Z.B.  Bestimmte Aktionen sollen geloggt werden  Bestimmte Aktionen erfordern die Autorisation des Benutzers Selbst wenn man ein Log-Modul oder ein Autorisations-Modul existiert, muss man immer noch in vielen Modulen darauf zugreifen Log-Modul Autorisations-Modul Modul 3Modul 4 Modul 2 Modul 1

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Probleme mit konventionellen Techniken das Log-Modul z.B. kann seine Schnittstelle ändern  es muss an sehr vielen Stellen der Code angepasst werden jeder Entwickler eines Moduls muss sich daran halten,.z.B. mit dem Log-Modul zu kommunizieren  fehleranfällig Systemweite Anforderungen können hinzukommen oder sich ändern  es muss an sehr vielen Stellen der Code angepasst werden der Code, der die eigentliche core logic implementiert wird unübersichtlicher Fazit: systemweite Anforderungen können mit konventionellen Techniken wie OOP nicht vernünftig modularisiert werden

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Beispiel – core logic package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); }

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Beispiel – Log Modul package example2; import java.util.Date; public class LogModule { public static void logPublicMethodExecutionBegin(String methodName) { System.out.println(new Date() + ": public method " + methodName + " begin"); } public static void logPublicMethodExecutionEnd(String methodName) { System.out.println(new Date() + ": public method " + methodName + " end"); } public static void logPrivateMethodExecutionBegin(String methodName) { System.out.println(new Date() + ": private method " + methodName + " begin"); } public static void logPrivateMethodExecutionEnd(String methodName) { System.out.println(new Date() + ": private method " + methodName + " end"); } package example2; import java.util.Date; public class LogModule { public static void logPublicMethodExecutionBegin(String methodName) { System.out.println(new Date() + ": public method " + methodName + " begin"); } public static void logPublicMethodExecutionEnd(String methodName) { System.out.println(new Date() + ": public method " + methodName + " end"); } public static void logPrivateMethodExecutionBegin(String methodName) { System.out.println(new Date() + ": private method " + methodName + " begin"); } public static void logPrivateMethodExecutionEnd(String methodName) { System.out.println(new Date() + ": private method " + methodName + " end"); }

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Beispiel – Logmodul aufrufen package example2; public class Module1 { private static int answer; public static void method1() { LogModule.logPublicMethodExecutionBegin("method1"); print("hello world!" + answer); LogModule.logPublicMethodExecutionEnd("method1"); } public static void method2() { LogModule.logPublicMethodExecutionBegin("method2"); answer = 42; LogModule.logPublicMethodExecutionEnd("method2"); } private static void print(String s) { LogModule.logPrivateMethodExecutionBegin("print"); System.out.println("printing: " + s); LogModule.logPrivateMethodExecutionEnd("print"); } package example2; public class Module1 { private static int answer; public static void method1() { LogModule.logPublicMethodExecutionBegin("method1"); print("hello world!" + answer); LogModule.logPublicMethodExecutionEnd("method1"); } public static void method2() { LogModule.logPublicMethodExecutionBegin("method2"); answer = 42; LogModule.logPublicMethodExecutionEnd("method2"); } private static void print(String s) { LogModule.logPrivateMethodExecutionBegin("print"); System.out.println("printing: " + s); LogModule.logPrivateMethodExecutionEnd("print"); }

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Beispiel – Logmodul aufrufen (2) package example2; public class Module2 { public static void method3() { LogModule.logPublicMethodExecutionBegin("method3"); Module1.method1(); LogModule.logPublicMethodExecutionEnd("method3"); return 42; } package example2; public class Module2 { public static void method3() { LogModule.logPublicMethodExecutionBegin("method3"); Module1.method1(); LogModule.logPublicMethodExecutionEnd("method3"); return 42; }

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Aspektorientierte Programmierung Modul 3Modul 4 Modul 2 Modul 1 Log-Modul Log-Aspekt

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Aspektorientierte Programmierung Bietet als Lösung für „crosscutting concerns“ eine neue Art von Modul: den Aspekt  Dieser definiert an zentraler Stelle „was“ „wann“ geschehen soll („weaving rules“) Ein „aspect-weaver“ konstruiert aus der core logic und den Aspekten ein neues System, das  weiterhin die Kernanforderungen erfüllt  die systemweiten Anforderungen erfüllt Die core logic wird weiterhin mit konventioneller Technik implementiert Die core logic weiß nichts davon, dass zusätzliche Funktionalität „eingebaut“ wird

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid AOP mit AspectJ AOP ist wie z.B. OOP eine Methode zu programmieren Es gibt verschiedene Implementierungen  Bei OOP z.B. C++, Java, Smalltalk  Bei AOP gibt es z.B. AspectJ AspectJ  benutzt Java, um die core logic zu implementieren  erweitert die Sprache Java um die Möglichkeit Aspekte mit ihren weaving rules zu implementieren  bietet einen Compiler (ajc) an, der den aspect weaver darstellt  erzeugt Java-Bytecode, der auf jeder JVM läuft  ist in Eclipse mit dem plugin ajdt vertreten

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Wo sind wir? Übersicht  Einführung in AOP  AOP mit AspectJ Kurzübersicht AspectJ  Wie identifiziert AspectJ Stellen im Programmfluss?  Wie definiert man, was an diesen Stellen passiert?  Das neue Modul für crosscutting concerns: aspect Vertiefung in AspectJ  Pointcut  Advice  Aspect  Kontext eines joinpoints an den advice weiterreichen

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Wie identifiziert AspectJ Stellen im Programmfluss? Joinpoints sind alle Stellen im Programm, die im Programmfluss erreicht werden  Methoden-Aufrufe  Konstruktor-Aufrufe  Variablenzuweisungen  das Werfen einer Exception usw.

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Joinpoints: Methodenaufruf package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); } call(public static void example1.Module1.method1()) Alle Aufrufe der public static Methode method1() in der Klasse example1.Module1

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Joinpoints: Methodenausführung package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); } execution(public static void example1.Module1.method1()) Ausführung der public static Methode method1() in der Klasse example1.Module1

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Joinpoints mit Wildcards package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); } Ausführung aller public Methoden in der Klasse example1.Module1 mit beliebigem Rückgabetyp execution(public * example1.Module1.*())

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Joinpoints: Parameter festlegen package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); } execution(* example1.Module1.*(String)) Ausführung aller Methoden in der Klasse example1.Module1 die genau einen Parameter vom Typ String entgegennehmen

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Joinpoints: Parameter mit Wildcards package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); } Ausführung aller public Methoden im Package example1, die beliebige Parameter nehmen execution(public * example1.*.*(..))

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Joinpoints: lesender Feldzugriff package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); } get(private static int example1.Module1.answer) Jeder lesende Zugriff auf das private static Feld answer in der Klasse example1.Module1

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Joinpoints: schreibender Feldzugriff package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module1 { private int answer; public static void method1() { print("hello world! “ + answer); } public static void method2() { answer=42; } private static void print(String s) { System.out.println("printing: " + s); } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Module2 { public static int method3() { Module1.method1(); return 42; } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); } package example1; public class Test { public static void main(String[] args) { Module1.method1(); Module1.method2(); Module2.method3(); } Jeder schreibende Zugriff auf das private static Feld answer in der Klasse example1.Module1 set(private static int example1.Module1.answer)

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Pointcut Ein Pointcut definiert eine Menge von jointpoints, an denen neue Funktionalität „eingebaut“ werden soll. Man spricht dabei vom „Abfangen“ (engl. capture) von jointpoints pointcut executionOfMethod1() : execution(* example1.Module1.method1()) Schlüsselwort Name Primitiver pointcut

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Verknüpfung von pointcuts Pointcuts können mit booleschen Operatoren verknüpft werden, um andere Mengen von joinpoints abzufangen pointcut executionOfMethod1OrMethod2() : executionOfMethod1() || execution(* example1.Module1.method2()) pointcut executionOfMethod1OrMethod2() : executionOfMethod1() || execution(* example1.Module1.method2()) Oben definierter pointcut Neuer primitiver pointcut

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Wo sind wir? Übersicht  Einführung in AOP  AOP mit AspectJ Kurzübersicht AspectJ  Wie identifiziert AspectJ Stellen im Programmfluss?  Wie definiert man, was an diesen Stellen passiert?  Das neue Modul für crosscutting concerns: aspect Vertiefung in AspectJ  Pointcut  Advice  Aspect  Kontext eines joinpoints an den advice weiterreichen

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Wie definiert man, was passieren soll, wenn ein joinpoint abgefangen wird? Die Aktion, die ausgeführt werden soll heißt in AspectJ advice Es gibt drei Varianten von advice: Aktion wird  vor dem joinpoint ausgeführt (before)  nach dem joinpoint ausgeführt (after)  um die Ausführung des joinpoints herum ausgeführt (around). Diese Variante kann den joinpoint sogar umgehen

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Definition von advice before() : executionOfMethod1OrMethod2 () { LogModule.logPublicMethodExecutionBegin (thisJoinPoint.getSignature().getName()); } before() : executionOfMethod1OrMethod2 () { LogModule.logPublicMethodExecutionBegin (thisJoinPoint.getSignature().getName()); } Schlüsselwort pointcut Block mit Java-Code before advice

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Definition von advice around adivce void around() : executionOfMethod1OrMethod2 () { LogModule.logPublicMethodExecutionBegin (thisJoinPoint.getSignature().getName()); proceed(); LogModule.logPublicMethodExecutionEnd (thisJoinPoint.getSignature().getName()); } void around() : executionOfMethod1OrMethod2 () { LogModule.logPublicMethodExecutionBegin (thisJoinPoint.getSignature().getName()); proceed(); LogModule.logPublicMethodExecutionEnd (thisJoinPoint.getSignature().getName()); } Rückgabetyp entspricht dem des joinpoints Schlüsselwort proceed() führt den joinpoint aus. Kann weggelassen werden zum Überspringen des joinpoints. Schlüsselwort proceed() führt den joinpoint aus. Kann weggelassen werden zum Überspringen des joinpoints.

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Wo sind wir? Übersicht  Einführung in AOP  AOP mit AspectJ Kurzübersicht AspectJ  Wie identifiziert AspectJ Stellen im Programmfluss?  Wie definiert man, was an diesen Stellen passiert?  Das neue Modul für crosscutting concerns: aspect Vertiefung in AspectJ  Pointcut  Advice  Aspect  Kontext eines joinpoints an den advice weiterreichen

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Das neue Modul für crosscutting concerns: aspect AspectJ führt den aspect ein, eine logische Einheit vergleichbar mit einer Klasse, die pointcuts und advices enthält. public aspect SimpleLogAspect { } public aspect SimpleLogAspect { }

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Das neue Modul für crosscutting concerns: aspect AspectJ führt den aspect ein, eine logische Einheit vergleichbar mit einer Klasse, die pointcuts und advices enthält. public aspect SimpleLogAspect { pointcut publicMethodExecution() : execution(public * *.Module*.* (..)); pointcut privateMethodExecution() : execution(private * *.Module*+.* (..)); } public aspect SimpleLogAspect { pointcut publicMethodExecution() : execution(public * *.Module*.* (..)); pointcut privateMethodExecution() : execution(private * *.Module*+.* (..)); }

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Das neue Modul für crosscutting concerns: aspect AspectJ führt den aspect ein, eine logische Einheit vergleichbar mit einer Klasse, die pointcuts und advices enthält. public aspect SimpleLogAspect { pointcut publicMethodExecution() : execution(* *.Module*.* (..)); pointcut privateMethodExecution() : execution(* *.Module*+.* (..)); before() : publicMethodExecution() { LogModule.logPublicMethodExecutionBegin(thisJoinPoint.getSignature().getName()); } before() : privateMethodExecution() { LogModule.logPrivateMethodExecutionBegin(“...”); } public aspect SimpleLogAspect { pointcut publicMethodExecution() : execution(* *.Module*.* (..)); pointcut privateMethodExecution() : execution(* *.Module*+.* (..)); before() : publicMethodExecution() { LogModule.logPublicMethodExecutionBegin(thisJoinPoint.getSignature().getName()); } before() : privateMethodExecution() { LogModule.logPrivateMethodExecutionBegin(“...”); }

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Das neue Modul für crosscutting concerns: aspect AspectJ führt den aspect ein, eine logische Einheit vergleichbar mit einer Klasse, die pointcuts und advices enthält. public aspect SimpleLogAspect { pointcut publicMethodExecution() : execution(* *.Module*.* (..)); pointcut privateMethodExecution() : execution(* *.Module*+.* (..)); before() : publicMethodExecution() { LogModule.logPublicMethodExecutionBegin(thisJoinPoint.getSignature().getName()); } before() : privateMethodExecution() { LogModule.logPrivateMethodExecutionBegin(“...”); } after() : publicMethodExecution() { LogModule.logPublicMethodExecutionEnd(“...”); } after() : privateMethodExecution() { LogModule.logPrivateMethodExecutionEnd(“...”); } public aspect SimpleLogAspect { pointcut publicMethodExecution() : execution(* *.Module*.* (..)); pointcut privateMethodExecution() : execution(* *.Module*+.* (..)); before() : publicMethodExecution() { LogModule.logPublicMethodExecutionBegin(thisJoinPoint.getSignature().getName()); } before() : privateMethodExecution() { LogModule.logPrivateMethodExecutionBegin(“...”); } after() : publicMethodExecution() { LogModule.logPublicMethodExecutionEnd(“...”); } after() : privateMethodExecution() { LogModule.logPrivateMethodExecutionEnd(“...”); }

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Fragen?

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Wo sind wir? Übersicht  Einführung in AOP  AOP mit AspectJ Kurzübersicht AspectJ  Wie identifiziert AspectJ Stellen im Programmfluss?  Wie definiert man, was an diesen Stellen passiert?  Das neue Modul für crosscutting concerns: aspect Vertiefung in AspectJ  Pointcut  Advice  Aspect  Kontext von joinpoints

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Pointcut Syntax Operatoren in der pointcut-Definition  Unär: !pc für alle joinpoints außer denen, die durch pc gefangen werden  Binar: pc1 || pc2 für alle joinpoints, die entweder von pc1 oder von pc2 gefangen werden  Binär: pc1 && pc2 für alle joinpoints, die von pc1 und pc2 gefangen werden  Klammerung ist möglich [access specifier] pointcut name([args]) : pointcut-definition

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Signatur-Patterns Um die joinpoints, die ein pointcut abfängt, effizient zu definieren, benutzt man folgende Signatur-Patterns, die im folgenden näher erläutert werden  Typ-Signatur für  Methoden-Signatur  Konstuktor-Signatur  Feld-Signatur

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Typ-Signatur-Pattern für  den Typ eines Feldes  die Klasse einer Methode, die aufgerufen wird  die Argumente einer Methode  Exceptions, die geworfen werden java.*.Date Alle Typen, die Date heißen im Package java oder einem direkten Subpackage Alle Typen, die Date heißen im Package java oder einem direkten Subpackage java..* Ein beliebiger Typ in einem beliebigen Subpackage von java javax.swing.*Model+ eine beliebige Unterklasse/Unterinterface, z.B. TableModel und TreeModel. Oder aber eine Klasse die das Interface implementiert z.B. DefaultTableModel eine beliebige Unterklasse/Unterinterface, z.B. TableModel und TreeModel. Oder aber eine Klasse die das Interface implementiert z.B. DefaultTableModel

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Methoden-Signatur-Pattern für  den Aufruf einer Methode: call ( )  die Ausführung einer Methode: execution ( ) Es müssen die Modifier, der return-Typ, der Klassenname, der Methodenname und die Parametertypen angegeben werden. public static void LogModule.log*() Typ-Signatur * LogModule.*(..) throws IOException+ beliebige Modifier beliebige Modifier beliebige Argumente beliebige Argumente wirft IOException oder Unterklassen Optional können auch die Typen der Exceptions, die geworfen werden angegeben werden

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Konstruktor-Signatur-Pattern Werden wie Methoden-Signaturen verwendet. Nur ist der „Methoden“-Name immer new und es gibt keinen Rückgabewert public Vector.new(*) genau ein Parameter beliebigen Typs Typ-Signatur-Pattern

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Feld-Signatur-Pattern public static int *Module*.answer Typ-Signatur-Pattern

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Überblick joinpoint-Typen Diese pointcuts fangen jointpoints, die in einer bestimmten Situation auftreten Joinpoint TypPrimitiver pointcut Syntax Methoden-Ausführungexecution(Methoden-Signatur) Methoden-Aufrufcall(Methoden-Signatur) Lesender Variablenzugriffget(Feld-Signatur) Schreibender Variablenzugriffset(Feld-Signatur) Exception Handler Ausführunghandler(Typ-Signatur) Objektinitialisierunginitialization(Konstruktor-Signatur)

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Lexikalisch basierte pointcuts Der lexikalische Sichtbarkeitsbereich ist ein Teil des Quellcodes wie die Definition einer Klasse oder einer Methode. Diese pointcuts fangen alle jointpoints, die im lexikalischen Sichtbarkeitsbereich eines Typs liegen, unabhängig von der Situation (wie Methoden-Aufruf/-Ausführung usw.) within(Typ-Signatur) withincode(Methoden-Signatur)

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Beispiel: joinpoint-Typen :Test :Module1 method1() print() method1 call method1 execution print callprint execution method1() method1 call && within(Module2) method1 execution main execution :Module2

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Controlflow basierte pointcuts Weiterhin gibt es pointcuts, die alle joinpoints, die während der Ausführung von joinpoints, die von einem anderen pointcut abgefangen werden auftreten. Die joinpoints befinden sich im „control flow“ eines pointcuts cflow(pointcut) alle joinpoints inklusive denen aus pointcut cflowbelow(pointcut) alle joinpoints exklusive denen aus pointcut

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Beispiel: Controlflow basierte pointcuts :Test:Module1:Module2 method3() method1() print() cflow(call(* Module2.method3())) fängt alle joinpoints in diesem Bereich cflowbelow(call(* Module2.method3())) fängt alle joinpoints in diesem Bereich

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Wo sind wir? Übersicht  Einführung in AOP  AOP mit AspectJ Kurzübersicht AspectJ  Wie identifiziert AspectJ Stellen im Programmfluss?  Wie definiert man, was an diesen Stellen passiert?  Das neue Modul für crosscutting concerns: aspect Vertiefung in AspectJ  Pointcut  Advice  Kontext von joinpoints  Aspect

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Advice Ähnelt einer Java-Methode Enthält Java-Code, der ausgeführt wird, wenn ein joinpoint abgefangen wird Es gibt drei Typen  before  after  around

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid before advice Wird ausgeführt bevor der gefangene joinpoint ausgeführt wird. Wird im advice body eine Exception geworfen, wird der joinpoint nicht ausgeführt. before() : executionOfMethod1() { doSomething(); } before() : executionOfMethod1() { doSomething(); } Wird hier eine Exception geworfen, wird method1 nicht ausgeführt

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid after advice Es gibt drei Typen, die zwischen den Rückkehrmöglichkeiten der gefangenen Methode unterscheiden after() : pointcut-spec wird immer ausgeführt after() returning : pointcut-spec wird nur ausgeführt, wenn die Methode erfolgreich war wird nur ausgeführt, wenn die Methode erfolgreich war after() throwing : pointcut-spec wird nur geworfen, wenn die Methode eine Exception geworfen hat wird nur geworfen, wenn die Methode eine Exception geworfen hat

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid around advice Wird um den joinpoint herum ausgeführt. Mit dem neuen Schlüsselwort proceed() wird die Ausführung des joinpoints veranlasst. Er hat einen Rückgabetyp, der dem der joinpoints entsprechen muss. void around() throws e: executionOfMethod1() { LogModule.logBegin(„…“); try { proceed(); } catch(Exception e) { LogModule.logExc(e); throw e; } LogModule.logEnd(„…“); } void around() throws e: executionOfMethod1() { LogModule.logBegin(„…“); try { proceed(); } catch(Exception e) { LogModule.logExc(e); throw e; } LogModule.logEnd(„…“); }

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid around advice Rückgabetyp muss dem Rückgabetyp der joinpoints entsprechen (oder Object bei verschiedenen Rückgabetypen) int around() : executionOfMethod3() { proceed(); } int around() : executionOfMethod3() { proceed(); } automatische Rückgabe int around() : executionOfMethod3() { int i = proceed(); System.out.println(“returned “ + i); return i; } int around() : executionOfMethod3() { int i = proceed(); System.out.println(“returned “ + i); return i; } Rückgabewert abfangen und selber an den Aufrufer zurückgeben Rückgabewert abfangen und selber an den Aufrufer zurückgeben Object around() : executionOfMethod1OrMethod3() { Object ret = proceed(); if(ret == null) { return ret; } else { return new Integer(((Integer) ret).intValue() + 1); } Object around() : executionOfMethod1OrMethod3() { Object ret = proceed(); if(ret == null) { return ret; } else { return new Integer(((Integer) ret).intValue() + 1); } verschiedene Rückgabe- typen. Rückgabewert verändert beachte: automatisches Wrappen primitiver Typen

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Wo sind wir? Übersicht  Einführung in AOP  AOP mit AspectJ Kurzübersicht AspectJ  Wie identifiziert AspectJ Stellen im Programmfluss?  Wie definiert man, was an diesen Stellen passiert?  Das neue Modul für crosscutting concerns: aspect Vertiefung in AspectJ  Pointcut  Advice  Kontext von joinpoints  Aspect

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Pointcuts, die den Kontext abfangen können Bestimmte pointcuts können den Kontext eines joinpoints sammeln und an den advice weitergeben. Das sind die pointcuts target(), this() und args(). this(Typ) z.B. this(Vector) : alle joinpoints, die in einem Objekt liegen, das vom Typ Vector ist (also auch in Unterklassen) z.B. this(Vector) : alle joinpoints, die in einem Objekt liegen, das vom Typ Vector ist (also auch in Unterklassen) target(Typ) z.B. target(Vector) : alle joinpoints, die eine Methode auf einem Objekt aufrufen, das vom Typ Vector ist z.B. target(Vector) : alle joinpoints, die eine Methode auf einem Objekt aufrufen, das vom Typ Vector ist args(Typ1, Typ2, …) z.B. args(String, *, int) : alle joinpoints, die als Argument drei Parameter nehmen vom Typ String, beliebig und int. z.B. args(String, *, int) : alle joinpoints, die als Argument drei Parameter nehmen vom Typ String, beliebig und int.

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Den Kontext eines joinpoints an den advice weiterreichen Der Kontext, den man im advice braucht, muss im advice und im zugehörigen pointcut deklariert werden wie die Parameter bei einer Methodendeklaration. pointcut printOperation(String str) : call(* example1.Module1.print(String)) && args(str) before(String printStr) : printOperation(printStr) { System.out.println(„Drucke „ + printStr); } pointcut printOperation(String str) : call(* example1.Module1.print(String)) && args(str) before(String printStr) : printOperation(printStr) { System.out.println(„Drucke „ + printStr); } Deklaration

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Aspect Der aspect ist ein Klassenähnliches Modul, in dem pointcuts und advices definiert werden. Es können Variablen und Methoden definiert werden Wiederholung des Beispiels aus der Einführung

Universität Bonn, Seminar AOP mit AspectJ WS 2003, Sebastian Scheid Fragen?