Folgende Beispiel-Programme finden sich in diesem Verzeichnis:
Verzeichnis | Kap. | Beschreibung | s.a. |
---|---|---|---|
1Hello | 9.2.1, 9.2.4, 9.3 | Das Hello-World-Beispiel dient als Grundlage für den Umgang mit dem Compiler (ajc) und dem AspectJ-Doc-Generator (ajdoc) | Quell-Dateien, Xlint-Option, AspectJ-Doc-Generator |
2LazyTjp | 9.2.3 | "fauler thisJoinPoint" - Test-Programm für die Option "-XlazyTjp" | Fauler thisJoinPoint |
3Xlint | 9.2.5 | Test-Programm für die verschiedenen Xlint-Optionen | Xlint-Beispiel |
4AntTest | 9.4.1 | ein leeres Ant-Beispiel für den ersten Test | Einbindung in Ant |
5Lotto | 9.4.2 ff | ein etwas ausführlicheres Ant-Beispiel | Aufruf des Compilers Generierung der API-Dokumentation |
Die Datei build.xml dient zum Aufräumen ('ant clean') und zum Übersetzen der AspectJ-Beispiele ('ant').
Um Ihnen das Abtippen aus dem Buch zu erleichtern, finden Sie auf dieser Seite unter der jeweiligen Überschrift die einzelnen Kommandos. Für Linux und Mac OS-X können Sie die Kommandos sollten Sie die einzelnen Befehle direkt kopieren können, für Windows müssen Sie sie evtl. ein wenig anpassen.
Hello aspect oriented world! Hello world! Welcome to the class hello.World some internals of -> execution(void hello.World.printGreeting()) args: [Ljava.lang.Object;@30c221 kind: method-execution signature: void hello.World.printGreeting() location: World.java:27 staticPart: execution(void hello.World.printGreeting()) target: hello.World@119298d this: hello.World@119298d string: execution(void hello.World.printGreeting()) long: execution(public void hello.World.printGreeting()) short: execution(World.printGreeting()) some internals of -> call(void hello.World.printGreeting()) args: [Ljava.lang.Object;@f72617 kind: method-call signature: void hello.World.printGreeting() location: World.java:24 staticPart: call(void hello.World.printGreeting()) target: hello.World@119298d this: null string: call(void hello.World.printGreeting()) long: call(public void hello.World.printGreeting()) short: call(World.printGreeting())
Im Gegensatz zum Buch wurde hier noch die Option "-d ../classes" eingefügt, um die erzeugten Class-Dateien von den Sourcen zu trennen.
Hier die einzelne Schritte der Compilation und Start von der
Kommandozeile (Linux).
Die Zeiten wurden unter Linux (SuSE 9.3) auf einem IBM T41 (Pentium M 1,6 GHz) ermittelt
und gelten für die Variante, die im Buch abgedruckt ist (before-Pointcut).
Falls nicht anders vermerkt, wurde AspectJ 1.5M2 und Java 1.5.0 eingesetzt.
time needed: 4508 ms
Ergebnis mit AspectJ 1.2 / JDK 1.4.2: ca. 4600 - 5100 ms
time needed: 1277 ms
Ergebnis mit AspectJ 1.2 / JDK 1.4.2: ca 1300 - 1800 ms
Mit Hotspot-Compiler wurden in beiden Fällen fast dieselben Zeiten erreicht.
Ergebnis: ca. 600 - 800 ms (JDK 1.4.2) bzw. 500 - 700 ms (JDK 1.5.0)
Für die Xlint-Beispiele müssen Sie den Source-Level auf mindestens Java 5 setzen, da mit Anotations gearbeitet wird.
src/x/lint/XlintTest.aj:88 [warning] does not match because declaring type is java.lang.Object, if match desired use target(x.taxi.Car) [Xlint:unmatchedSuperTypeInCall] see also: src/x/lint/Main.java:29::0 src/x/lint/XlintTest.aj:32 [warning] no match for this type name: java.xxx.Object [Xlint:invalidAbsoluteTypeName] call(String java.xxx.Object.toString()); ^^^^^^^^^^^^^^^ src/x/lint/XlintTest.aj:35 [warning] no match for this type name: java.lang.Xxx [Xlint:invalidAbsoluteTypeName] call(String java.lang.Xxx.toString()); ^^^^^^^^^^^^^ src/x/lint/XlintTest.aj:42 [warning] no match for this type name: java.lang.Xxx [Xlint:invalidAbsoluteTypeName] after() : call(String java.lang.Xxx.toString()) { ^^^^^^^^^^^^^^^^^ src/x/lint/XlintTest.aj:70 [warning] this affected type is not exposed to the weaver: java.lang.Object [Xlint:typeNotExposedToWeaver] public int Object.dummy = 0; src/x/lint/XlintTest.aj:158 [warning] no interface constructor-execution join point - use java.util.List+ for implementing classes [Xlint:noInterfaceCtorJoinpoint] execution(java.util.List.new()); ^^^^^^^^^^^^^^^^^^^^^^ src/x/lint/XlintTest.aj:166 [warning] java.lang.UnsupportedOperationException will not be softened as it is already a RuntimeException [Xlint:runtimeExceptionNotSoftened] declare soft : UnsupportedOperationException ^^^^^^^^^^^^^^^^^^^^^^^^ src/x/lint/XlintTest.aj:93 [warning] advice defined in x.lint.XlintTest has not been applied [Xlint:adviceDidNotMatch] 8 warnings
In der Ausgabe wurde die Pfad-Angabe gekürzt.
Um den Compiler mit den verschiedenen Xlint-Optionen aufzurufen, geben Sie unter Linux eines der folgenden Kommandos auf der Kommandozeile ein:
src/hello/XlintTest.aj:13 [warning] no match for this type name: gibts.net.World [Xlint:invalidAbsoluteTypeName] call(void gibts.net.World.printGreeting()); ^^^^^^^^^^^^^^^^^^^^ 1 warning
rc/hello/XlintTest.aj:13 [warning] no match for this type name: gibts.net.World [Xlint:invalidAbsoluteTypeName] call(void gibts.net.World.printGreeting()); ^^^^^^^^^^^^^^^^^^^^ 1 error
src/hello/WorldAspect.aj:42 [warning] serialVersionUID of type hello.World needs to be set because of added static initializer [Xlint:needsSerialVersionUIDField] src/hello/WorldAspect.aj:38 [warning] serialVersionUID of type hello.World needs to be set because of added static initializer [Xlint:needsSerialVersionUIDField] src/hello/XlintTest.aj:13 [warning] no match for this type name: gibts.net.World [Xlint:invalidAbsoluteTypeName] call(void gibts.net.World.printGreeting()); ^^^^^^^^^^^^^^^^^^^^ src/hello/WorldAspect.aj:42 [warning] serialVersionUID of type hello.World needs to be set because of added static initializer [Xlint:needsSerialVersionUIDField] src/hello/WorldAspect.aj:38 [warning] serialVersionUID of type hello.World needs to be set because of added static initializer [Xlint:needsSerialVersionUIDField] 5 warnings
> Calling ajc... /home/oliver/doc/Kurs/AspectJ/www/AOP_AspectJ/examples/Kap09-Toolbox/1Hello/src/hello/XlintTest.aj:13 [warning] no match for this type name: gibts.net.World [Xlint:invalidAbsoluteTypeName] call(void gibts.net.World.printGreeting()); ^^^^^^^^^^^^^^^^^^^^ 1 warning > Building signature files... > Calling javadoc... Loading source files for package hello... Constructing Javadoc information... Standard Doclet version 1.4.2_08 Generating doc/constant-values.html... Building tree for all the packages and classes... Building index for all the packages and classes... Generating doc/overview-tree.html... Generating doc/index-all.html... Generating doc/deprecated-list.html... Building index for all classes... Generating doc/allclasses-frame.html... Generating doc/allclasses-noframe.html... Generating doc/index.html... Generating doc/packages.html... Generating doc/hello/package-frame.html... Generating doc/hello/package-summary.html... Generating doc/hello/package-tree.html... Generating doc/hello/AspectHelper.html... Generating doc/hello/World.html... Generating doc/hello/WorldAspect.html... Generating doc/hello/XlintTest.html... Generating doc/serialized-form.html... Generating doc/package-list... Generating doc/help-doc.html... Generating doc/stylesheet.css... > Decorating html files... > Removing generated tags (this may take a while)... > Finished.
Wenn bei Ihnen alles geklappt hat, finden Sie anschließend im doc-Verzeichnis die enstrechend API-Dokumentation
Buildfile: build.xml init: BUILD SUCCESSFUL Total time: 1 second
Buildfile: build.xml init: [echo] building Kap09-5Lotto... [mkdir] Created dir: 5Lotto/build/classes [mkdir] Created dir: 5Lotto/build/testclasses compile.java: [javac] Compiling 2 source files to 5Lotto/build/classes [javac] Note: 5Lotto/src/java/lotto/Trommel.java uses unchecked or unsafe operations. [javac] Note: Recompile with -Xlint:unchecked for details. compile.aj: compile: BUILD SUCCESSFUL Total time: 10 seconds
Sollten Sie stattdessen die Fehlermeldung ReflectionFactory unable to load org.aspectj.ajdt.ajc.AjdtCommand as org.aspectj.bridge.ICommand erhalten, überprüfen Sie nochmals, ob sich apsectjtools.jar im CLASSPATH oder im lib-Verzeichnis von Ant befindet.
Buildfile: build.xml init: [echo] building Kap09-5Lotto... compile.java: release.jar: [copy] Copying 1 file to 5Lotto/build create.test.jar: BUILD SUCCESSFUL Total time: 7 seconds
Buildfile: build.xml init: [echo] building Kap09-5Lotto... compile.java: release.jar: create.test.jar: add.aspectjrt2test.jar: [jar] Updating jar: 5Lotto/build/lotto-test.jar BUILD SUCCESSFUL Total time: 9 seconds
Protokollierung: Profiling.log Ziehung: 40 39 48 45 8 7
Buildfile: build.xml copy.src: [copy] Copying 1 file to /home/oliver/doc/Kurs/AspectJ/www/AOP_AspectJ/examples/Kap09-Toolbox/5Lotto/build/src [copy] Copying 1 file to /home/oliver/doc/Kurs/AspectJ/www/AOP_AspectJ/examples/Kap09-Toolbox/5Lotto/build/src [copy] Copying 2 files to /home/oliver/doc/Kurs/AspectJ/www/AOP_AspectJ/examples/Kap09-Toolbox/5Lotto/build/src ajdoc: [java] > Calling ajc... [java] > Building signature files... [java] > Calling javadoc... [java] Loading source files for package lotto... [java] Loading source files for package toolbox... [java] Constructing Javadoc information... [java] Standard Doclet version 1.5.0_04 [java] Building tree for all the packages and classes... [java] Generating build/doc/lotto//Trommel.html... [java] /home/oliver/doc/Kurs/AspectJ/www/AOP_AspectJ/examples/Kap09-Toolbox/5Lotto/ajdocworkingdir/lotto/Trommel.java:49: warning - @return tag has no arguments. [java] /home/oliver/doc/Kurs/AspectJ/www/AOP_AspectJ/examples/Kap09-Toolbox/5Lotto/ajdocworkingdir/lotto/Trommel.java:43: warning - @return tag has no arguments. [java] Generating build/doc/toolbox//Log.html... [java] Generating build/doc/toolbox//LogAspect.html... [java] Generating build/doc/overview-frame.html... [java] Generating build/doc/lotto//package-frame.html... [java] Generating build/doc/lotto//package-summary.html... [java] Generating build/doc/lotto//package-tree.html... [java] Generating build/doc/toolbox//package-frame.html... [java] Generating build/doc/toolbox//package-summary.html... [java] Generating build/doc/toolbox//package-tree.html... [java] Generating build/doc/constant-values.html... [java] Building index for all the packages and classes... [java] Generating build/doc/overview-tree.html... [java] Generating build/doc/index-all.html... [java] Generating build/doc/deprecated-list.html... [java] Building index for all classes... [java] Generating build/doc/allclasses-frame.html... [java] Generating build/doc/allclasses-noframe.html... [java] Generating build/doc/index.html... [java] Generating build/doc/overview-summary.html... [java] Generating build/doc/help-doc.html... [java] Generating build/doc/stylesheet.css... [java] 2 warnings [java] > Decorating html files... [java] > Removing generated tags (this may take a while)... [java] > Finished. BUILD SUCCESSFUL Total time: 13 seconds
Das Ergebnis kann anschliepend im build/doc-Verzeichnis unter index.html gegutachtet werden.