ERLEDIGT
NEIN
NEIN
ANTWORTEN
0
0
ZUGRIFFE
2474
2474
EMPFEHLEN
-
03.03.06 16:01 #1
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo!
Hier mal ein kleines Beispiel wie man mit AspectJ 5 fremde Bibliotheken mit Aspekten ausstatten kann. Als Beispiel nehmen wir eine Klasse welche in einer Methode einen try...catch Block zur Ausnahmebehandlung enthält, diesen aber "ausversehen" leer gelassen hat... man soll es kaum glauben aber solcher Code gelangt auch heute noch in Produktionsumgebungen...
.
Um diesem Dillema zu entfliehen verwenden wir AspectJ um die Ausnahmen die uns interessieren, aber von der eigentlichen Implementierung her nicht erscheinen doch noch anzuzeigen...
zum Laden unseres Aspekts verwenden wir eine Technik namens LoadTime-Weaving. Dies erlaubt es uns Klassen zum Ladezeitpunkt zu Instrumentieren (mit Aspekt-Code anzureichern). Dazu verwenden wir den von AspectJ 5 bereitgestellten javaagent aus aspectjweaver.jar. Dies funktioniert natürlich nur dann wenn die zugrundeliegende JVM Instrumentierung unterstützt. Das tun beispielsweise Java 5 via JVMTI (JVM Tool Interface) und BEAs JRockIt Implementierungen (dann auch schon für Java 1.3 und 1.4)
Im Folgendem definieren wir 2 Projekte. Projekt 1 ist ein ganz normales java Projekt in dem wir unsere "Geschäftslogik" implementieren. Projekt 2 besitzt eine Abhängigkeit zu Projekt 1 und beinhaltet die von uns definierten Aspekte.
Unser Beispiel: (Projekt 1)
Das Projekt 1 exportieren wir nun in ein jar-File mit dem Namen business.jarCode :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
/** * */ package de.tutorials.business; /** * @author Tom * */ public class MainBusiness { /** * @param args */ public static void main(String[] args) { System.out.println(makeMoney()); } private static int makeMoney() { try { doAVeryBadThing(); return 1000; // never reached but compiles ;-) } catch (Exception e) { // bad bad thing... // NEVER DO THIS return -1; } } /** * @throws NoSuchFieldException * @throws IllegalAccessException */ private static void doAVeryBadThing() throws Exception { throw new Exception("Attack a bank..."); } }
Unser ErrorHandlingAspect: (Projekt 2) gibt uns die Codestellen aus an der eine Exception aufgetreten ist und gibt den StackTrace aus.
Zusätzlich zu unserem Aspekt definieren wir die Datei aop.xml welche wir im meta-inf Verzeichnis platzieren.Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
package de.tutorials.aspects.errorhandling; import de.tutorials.business.MainBusiness; /** * @author Tom * */ public aspect ErrorHandlingAspect { pointcut businessMethodExecution() : execution(* MainBusiness.*(..)); after() throwing (Exception e) : businessMethodExecution(){ System.err.println("Exception occured after the execution of: " + thisJoinPoint.getSignature()); e.printStackTrace(); } }
Unsere aop.xml im meta-inf Verzeichnis:
Das Projekt 2 exportieren wir nun in ein jar-File mit dem Namen debug-aspect.jar.Code :1 2 3 4 5 6 7 8 9 10 11
<aspectj> <aspects> <aspect name="de.tutorials.aspects.errorhandling.ErrorHandlingAspect"/> </aspects> <weaver options="-XlazyTjp"> <include within="de.tutorials.business..*"/> </weaver> </aspectj>
Einfacher Aufruf ohne Aspect:
Aufruf mit Aspect:Code :1 2
C:\>java -jar business.jar -1
Zum Aufrufen des Aspekts benötigen wir verschiedene jars der AspectJ 5 Laufzeit:
-aspectjrt.jar
-aspectjweaver
-unser debug-aspect.jar
Ein Beispiel Aufruf könnte wie folgt aussehen
Viel Spaß damitCode :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
C:\>java -Daj.weaving.verbose=true -Dorg.aspectj.weaver.showWeaveInfo=true -javaagent:aspectjweaver.jar -Xbootclasspath/a:c:/debug-aspect.jar;c:/aspectjrt.jar -jar business.jar info AspectJ Weaver Version 1.5.0 built on Tuesday Dec 20, 2005 at 13:26:12 GMT info register classloader sun.misc.Launcher$AppClassLoader@24724388 info using file:/C:/debug-aspect.jar!/META-INF/aop.xml info register aspect de.tutorials.aspects.errorhandling.ErrorHandlingAspect info weaving 'de/tutorials/business/MainBusiness' weaveinfo Join point 'method-execution(void de.tutorials.business.MainBusiness.doAVeryBadThing())' in Type 'de.tutorials.business.MainBusiness' (MainBusiness.java:35) advised by afterThrowing advice from 'de.tutorials.aspects.errorhandling.ErrorHandlingAspect' (ErrorHandlingAspect.aj:11) Exception occured after the execution of: void de.tutorials.business.MainBusiness.doAVeryBadThing() java.lang.Exception: Attack a bank... at de.tutorials.business.MainBusiness.doAVeryBadThing(MainBusiness.java:35) at de.tutorials.business.MainBusiness.makeMoney(MainBusiness.java:21) at de.tutorials.business.MainBusiness.main(MainBusiness.java:16) -1 C:\>
Btw. AspectJ rocks 
Die beiden Jars findet man im Anhang.
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
Ähnliche Themen
-
AspectJ Post-Compile weaving
Von duennes im Forum JavaAntworten: 0Letzter Beitrag: 17.04.09, 10:37 -
Time erhöhen? Wie rechnet time denn?
Von Kalma im Forum PHPAntworten: 6Letzter Beitrag: 12.12.06, 07:37 -
Dateiimport mittels Load Data Infile
Von zamo76 im Forum Relationale DatenbanksystemeAntworten: 4Letzter Beitrag: 19.10.06, 12:36 -
[AspectJ] Aspekte zur Laufzeit?
Von TommyMo im Forum JavaAntworten: 2Letzter Beitrag: 20.01.06, 10:49 -
AspectJ Tutorial
Von theindra im Forum JavaAntworten: 3Letzter Beitrag: 18.01.05, 17:05






Zitieren
Login





