|  | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> | 
|  | <html> <head> | 
|  | <title>AspectJ 1.1 Readme</title> | 
|  | <style type="text/css"> | 
|  | <!-- | 
|  | P   { margin-left:  20px; } | 
|  | PRE { margin-left:  20px; } | 
|  | LI  { margin-left:  20px; } | 
|  | H4  { margin-left:  20px; } | 
|  | H3  { margin-left:  10px; } | 
|  | --> | 
|  | </style> | 
|  | </head> | 
|  |  | 
|  | <body> | 
|  | <div align="right"><small> | 
|  | © Copyright 2002 Palo Alto Research Center, Incorporated, | 
|  | 2003 Contributors. | 
|  | All rights reserved. | 
|  | </small></div> | 
|  |  | 
|  |  | 
|  | <h1>AspectJ 1.1 Readme</h1> | 
|  |  | 
|  | <p> This is the initial release of AspectJ 1.1.  It includes a small | 
|  | number of new language features as well as major improvements to the | 
|  | functionality of the tools.   </p> | 
|  |  | 
|  | <p> | 
|  | This document describes the differences between | 
|  | AspectJ versions 1.1 and 1.0.6. | 
|  | Users new to AspectJ need only read | 
|  | the <a href="progguide/index.html">AspectJ Programming Guide</a> | 
|  | since it describes the 1.1 language. | 
|  | Users familiar with AspectJ 1.0 may find this document | 
|  | a quicker way to learn what changed in the language | 
|  | and tools, and should use it as a guide for porting | 
|  | programs from 1.0 to 1.1. | 
|  | </p> | 
|  |  | 
|  | <p>This document first summarizes changes from the 1.0 release in | 
|  | </p> | 
|  |  | 
|  | <ul> | 
|  | <li><a href="#language">the language</a>,</li> | 
|  | <li><a href="#compiler">the compiler</a>,</li> | 
|  | <li><a href="#tools">the support tools</a>,</li> | 
|  | <li><a href="#runtime">the runtime</a>,</li> | 
|  | <li><a href="#devenv">the development environment support</a>,</li> | 
|  | <li><a href="#sources">the sources</a>, and</li> | 
|  | <li><a href="#distribution">the distribution</a>,</li> | 
|  | </ul> | 
|  |  | 
|  | <p> then <a href="#details">details</a> some of the language | 
|  | and compiler changes, | 
|  | and finally points readers to the bug database for any | 
|  | <a href="#knownLimitations">known limitations</a>. | 
|  | </p> | 
|  |  | 
|  | <!-- ============================== --> | 
|  | <hr> | 
|  | <h2><a name="language">The Language</a></h2> | 
|  |  | 
|  | <p> AspectJ 1.1 is a slightly different language than AspectJ 1.0. | 
|  | In all but a few cases, programs written in AspectJ 1.0 should | 
|  | compile correctly in AspectJ 1.1.  In many cases, there are | 
|  | new or preferred forms in AspectJ 1.1.  However, some AspectJ 1.0 | 
|  | features have changed in 1.1, so some 1.0 programs | 
|  | will not compile or will run differently in 1.1. | 
|  | The corresponding features are marked below as compile-time | 
|  | or run-time incompatible (<em>CTI</em> or <em>RTI</em>, respectively). | 
|  | When the language change involves a move in the static shadow effective | 
|  | at run-time but also apparent at compile-time (e.g., in declare | 
|  | error or warning statements), it is marked <em>CRTI</em>. | 
|  | Programs using run-time incompatible forms should be verified that | 
|  | they are behaving as expected in 1.1. | 
|  | </p> | 
|  |  | 
|  | <p> | 
|  | Most changes to the language are additions to expressibility | 
|  | requested by our users: | 
|  | </p> | 
|  |  | 
|  | <ul> | 
|  | <li><a href="#THROWS_PATTERN">Matching based on throws</a>: You can | 
|  | now make finer discriminations between methods based on declared | 
|  | exceptions. </li> | 
|  |  | 
|  | <li><a href="#NEW_PCDS">New kinded pointcut designators</a>: Now | 
|  | every kind of join point has a corresponding kinded pointcut | 
|  | designator. </li> | 
|  | </ul> | 
|  |  | 
|  | <p> Some are have different behavior in edge cases but offer | 
|  | improved power and clarity: </p> | 
|  |  | 
|  | <ul> | 
|  | <li><a href="#ASPECT_PRECEDENCE">New aspect precedence form</a>: | 
|  | AspectJ 1.1 has a new declare form, <code>declare | 
|  | precedence</code>, that replaces the "dominates" | 
|  | clause on aspects.  (<em>CTI</em>) </li> | 
|  |  | 
|  | <li>The order of <a href="#SUPER_IFACE_INITS">initialization join | 
|  | points for super-interfaces</a> has been clarified. (<em>RTI</em>) </li> | 
|  | </ul> | 
|  |  | 
|  | <p> But in order to support weaving into bytecode effectively, | 
|  | several incompatible changes had to be made to the language: </p> | 
|  |  | 
|  | <ul> | 
|  | <li>A class's default constructor may | 
|  | <a href="#DEFAULT_CONSTRUCTOR_CONFLICT">conflict</a> with an | 
|  | inter-type constructor. (<em>CTI</em>) </li> | 
|  |  | 
|  | <li><a href="#NO_CALLEE_SIDE_CALL">No callee-side call join | 
|  | points</a>: The AspectJ 1.1 compiler does not expose call join | 
|  | points unless it is given the calling code. (<em>CRTI</em>) </li> | 
|  |  | 
|  | <li><a href="#SINGLE_INTERCLASS_TARGET">One target for intertype | 
|  | declarations</a>. (<em>CTI</em>) </li> | 
|  |  | 
|  | <li><a href="#UNAVAILABLE_JOIN_POINTS">No initializer execution join | 
|  | points</a>. (<em>RTI</em>)</li> | 
|  |  | 
|  | <li><a href="#AFTER_HANDLER">No after or around advice on handler | 
|  | join points</a>. (<em>CTI</em>) </li> | 
|  |  | 
|  | <li><a href="#CONSTRUCTOR_EXECUTION_IS_BIGGER">Initializers run | 
|  | inside constructor execution join points</a>.  (<em>RTI</em>)</li> | 
|  |  | 
|  | <li><a href="#INTER_TYPE_FIELD_INITIALIZERS">inter-type field | 
|  | initializers</a> run before class-local field initializers. (<em>RTI</em>) </li> | 
|  |  | 
|  | <li><a href="#WITHIN_MEMBER_TYPES">Small limitations of the within | 
|  | pointcut.</a> (<em>CRTI</em>)</li> | 
|  |  | 
|  | <li><a href="#WITHIN_CODE">Small limitations of the withincode | 
|  | pointcut.</a> (<em>CRTI</em>)</li> | 
|  |  | 
|  | <li><a href="#INSTANCEOF_ON_WILD">Can't do instanceof matching on | 
|  | type patterns with wildcards</a>. (<em>CTI</em>) </li> | 
|  |  | 
|  | <li><a href="#NO_SOURCE_COLUMN">SourceLocation.getColumn() is | 
|  | deprecated and will always return 0</a>. (<em>RTI</em>) </li> | 
|  |  | 
|  | <li>The interaction between aspect instantiation and advice has been | 
|  | <a href="#ASPECT_INSTANTIATION_AND_ADVICE">clarified</a>.  (<em>RTI</em>) </li> | 
|  |  | 
|  | <li><a href="#STRINGBUFFER">The String + operator is now correctly advised</a>. | 
|  | (<em>CRTI</em>) </li> | 
|  | </ul> | 
|  |  | 
|  | <p><a name="NEW_LIMITATIONS">There</a> are a couple of language | 
|  | limitations for things that are rarely used that make the | 
|  | implementation simpler, so we have restricted the language accordingly. | 
|  | </p> | 
|  |  | 
|  | <ul> | 
|  | <li><a href="#VOID_FIELD_SET">Field set join points now have a | 
|  | <code>void</code> return type.</a>  This will require | 
|  | porting of code that uses the <code>set</code> PCD in conjunction | 
|  | with after-returning or around advice.  (<em>CTI</em>) <p></p></li> | 
|  |  | 
|  | <li>'declare soft: TYPE: POINTCUT;' - AspectJ 1.1 only | 
|  | accepts TYPE rather than a TYPE_PATTERN. | 
|  | This limitation makes declare soft | 
|  | much easier to implement efficiently.  (<em>CTI</em>) <p></p></li> | 
|  |  | 
|  | <li>Inter-type field declarations only allow a single field per | 
|  | line, i.e. this is now illegal 'int C.field1, D.field2;' This must | 
|  | instead be, 'int C.field1; int D.field2;' (<em>CTI</em>) <p></p></li> | 
|  |  | 
|  | <li>We did not implement the handling of more than one | 
|  | <code>..</code> wildcard in args PCD's (rarely encountered in the | 
|  | wild) because we didn't have the time.  This might be available | 
|  | in later releases if there is significant outcry. (<em>CTI</em>) </li> | 
|  |  | 
|  | </ul> | 
|  |  | 
|  | <p>We did not implement the long-awaited <a href="#PER_TYPE">new | 
|  | pertype aspect specifier</a> in this release, but it may well | 
|  | be in a future release.</p> | 
|  |  | 
|  |  | 
|  | <!-- ============================== --> | 
|  | <hr> | 
|  | <h2><a name="compiler">The Compiler</a></h2> | 
|  |  | 
|  | <p> The compiler for AspectJ 1.1 is different than the compiler for | 
|  | AspectJ 1.0.  While this document describes the differences in the | 
|  | compiler, it's worthwhile noting that much effort has been made to | 
|  | make sure that the interface to ajc 1.1 is, as much as possible, the | 
|  | same as the interface to ajc 1.0.  There are two important changes | 
|  | under the hood, however. </p> | 
|  |  | 
|  | <p> First, the 1.1 compiler is implemented on top of the | 
|  | open-source Eclipse compiler.  This has two benefits: It allows us | 
|  | to concentrate on the AspectJ extensions to Java and let the Eclipse | 
|  | team worry about making sure the Java edge cases work, and it allows | 
|  | us to piggyback on Eclipse's already mature incremental compilation | 
|  | facilities.  </p> | 
|  |  | 
|  | <p> Second, ajc now cleanly delineates compilation of source code | 
|  | from assembly (or "weaving") of bytecode.  The compiler still | 
|  | accepts source code, but internally it transforms it into bytecode | 
|  | format before weaving. </p> | 
|  |  | 
|  | <p> This new architecture, and other changes to the compiler, allows | 
|  | us to implement some features that were defined in the AspectJ 1.0 | 
|  | language but not implementable in the 1.1 compiler.  It also makes | 
|  | some new features available: </p> | 
|  |  | 
|  | <ul> | 
|  | <li><a href="#SOURCEROOT">The -sourceroots option</a> | 
|  | takes one or more directories, and indicates that all the source | 
|  | files in those directories should be passed to the compiler. </li> | 
|  |  | 
|  | <li><a href="#BYTECODE_WEAVING">The -injars option</a> | 
|  | takes one or more jar files, and indicates that all the classfiles | 
|  | in the jar files should be woven into.  </li> | 
|  |  | 
|  | <li><a href="#BINARY_ASPECTS">The -aspectpath option</a> | 
|  | takes one or more jar files, and weaves any aspects in .class form | 
|  | into the sources.</li> | 
|  |  | 
|  | <li><a href="#OUTJAR">The -outjar option</a> indicates | 
|  | that the result classfiles of compiling and weaving should be placed | 
|  | in the specified jar file. </li> | 
|  |  | 
|  | <li><a href="#XLINT">The -Xlint option</a> allows control over | 
|  | warnings.</li> | 
|  |  | 
|  | <li><a href="#OTHER_X_OPTIONS">Various -X options</a> changed.</li> | 
|  |  | 
|  | <li><a href="#INCREMENTAL">The -incremental option</a> tells the | 
|  | AspectJ 1.1 compiler to recompile only as necessary. </li> | 
|  | </ul> | 
|  |  | 
|  | <p> Some other features we wanted to support for 1.1, but did not make | 
|  | it into this release: </p> | 
|  |  | 
|  | <ul> | 
|  | <li><a href="#ERROR_MESSAGES">Error messages will sometimes be scary</a></li> | 
|  | <li><a href="#MESSAGE_CONTEXT">Source code context is not shown | 
|  | for errors and warnings detected during bytecode weaving</a></li> | 
|  | </ul> | 
|  |  | 
|  | <p> But some features of the 1.0 compiler are not supported in the | 
|  | 1.1 compiler: </p> | 
|  |  | 
|  | <ul> | 
|  | <li><a href="#NO_SOURCE">The source-related options</a> -preprocess, | 
|  | -usejavac, -nocomment and -workingdir</li> | 
|  |  | 
|  | <li><a href="#NO_STRICT_LENIENT">The -strict and -lenient options</a> | 
|  | </li> | 
|  |  | 
|  | <li><a href="#NO_PORTING">The -porting option</a></li> | 
|  |  | 
|  | <li><a href="#13_REQUIRED">J2SE 1.2 is not supported; | 
|  | J2SE 1.3 or later is required.</a></li> | 
|  | </ul> | 
|  |  | 
|  | <p> A short description of the options ajc accepts is available with | 
|  | "<code>ajc -help</code>". | 
|  | Longer descriptions are available in the | 
|  | <a href="devguide/ajc-ref.html">Development Environment Guide | 
|  | section on ajc</a>. </p> | 
|  | <p> </p> | 
|  |  | 
|  |  | 
|  | <p> Some changes to the implementation are almost entirely | 
|  | internal: | 
|  | </p> | 
|  |  | 
|  | <ul> | 
|  | <li>The behavior of the compiler in | 
|  | <a href="#TARGET_TYPES_MADE_PUBLIC">lifting the visibility</a> of | 
|  | the target types of some declares and pointcuts to public has been | 
|  | clarified. </li> | 
|  | </ul> | 
|  |  | 
|  | <p> Also, it is worth noting that because AspectJ now works on bytecode, | 
|  | it is somewhat sensitive to how different compilers generate | 
|  | bytecode, especially when compiling with and without <a | 
|  | href="#ONE_FOUR_METHOD_SIGNATURES">the -1.4 flag</a>. </p> | 
|  |  | 
|  |  | 
|  |  | 
|  | <!-- ============================== --> | 
|  | <hr> | 
|  | <h2><a name="tools">Support Tools</a></h2> | 
|  |  | 
|  | <p>This release includes an Ant task for old-style 1.0 build | 
|  | scripts, a new task for all the new compiler options, and a | 
|  | CompilerAdapter to support running <code>ajc</code> with the Javac | 
|  | task by setting the <code>build.compiler</code> property. | 
|  | The new task can automatically copy input resources to output | 
|  | and work in incremental mode using a "tag" file. | 
|  | </p> | 
|  |  | 
|  | <p>This release does not include <code>ajdoc</code>, the | 
|  | documentation tool for AspectJ sources. | 
|  | Ajdoc is deeply dependent on the | 
|  | abstract syntax tree classes from the old compiler, so it needs a | 
|  | bottom-up rewrite. We think it best to use this opportunity to | 
|  | implement more general API's for publishing and rendering static | 
|  | structure. Because those API's are last to settle in the new | 
|  | architecture, and because the compiler itself is a higher priority, | 
|  | we are delaying work on ajdoc until after the 1.1 release.</p> | 
|  |  | 
|  | <p>AspectJ 1.1 will not include <tt>ajdb</tt>, the AspectJ | 
|  | stand-alone debugger.  It is no longer necessary for two reasons. | 
|  | First, the -XnoInline flag will tell the compiler to generate | 
|  | code without inlining that should work correctly with any Java | 
|  | debugger.  For code generated with inlining enabled, more | 
|  | third-party debuggers are starting to work according to JSR 45, | 
|  | "Debugging support for other languages," which is supported by | 
|  | AspectJ 1.0.  We aim to support JSR-45 in AspectJ 1.1, but | 
|  | support will not be in the initial release.  Consider using | 
|  | the -XnoInline flag until support is available.</p> | 
|  |  | 
|  | <!-- ============================== --> | 
|  | <hr> | 
|  | <h2><a name="runtime">The Runtime Library</a></h2> | 
|  |  | 
|  | <p>This release has minor additions to the runtime library classes. | 
|  | As with any release, you should compile and run with the runtime | 
|  | library that came with your compiler, and you may run with | 
|  | a later version of the library without recompiling your code.</p> | 
|  |  | 
|  | <p> In one instance, however, runtime classes behave differently this release. | 
|  | Because the AspectJ 1.1 compiler does its weaving through | 
|  | bytecode, column numbers of source locations are not available. | 
|  | Therefore, <code>thisJoinPoint.getSourceLocation().getColumn()</code> | 
|  | is deprecated and will always return 0. </p> | 
|  |  | 
|  | <!-- ============================== --> | 
|  | <hr> | 
|  | <h2><a name="devenv">The AJDE Tools</a></h2> | 
|  |  | 
|  | <p> The AspectJ Browser supports incremental compilation and running | 
|  | programs.  AJDE for JBuilder, AJDE for NetBeans, and AJDE for Emacs | 
|  | are now independent SourceForge projects (to keep their licenses). | 
|  | They use the batch-build mode of the new compiler. | 
|  | </p> | 
|  |  | 
|  | <!-- ============================== --> | 
|  | <hr> | 
|  | <h2><a name="sources">The Sources and the Licenses</a></h2> | 
|  |  | 
|  | <p> The AspectJ tools sources are available under the | 
|  | <a href="http://eclipse.org/legal/cpl-v10.html">Common Public | 
|  | License</a> in the CVS repository | 
|  | at <a href="http://eclipse.org/aspectj">http://eclipse.org/aspectj</a>. | 
|  | For more information, see the FAQ entry on | 
|  | <a href="faq.html#q:buildingsource">building sources</a>. | 
|  | </p> | 
|  |  | 
|  |  | 
|  | <!-- ============================== --> | 
|  | <hr> | 
|  | <h2><a name="distribution">The AspectJ distribution</a></h2> | 
|  |  | 
|  | <p> AspectJ 1.0 had many distributions - for the tools, | 
|  | the documentation, each IDE support package, | 
|  | their respective sources, and the Ant tasks - | 
|  | because they came under different licenses. | 
|  | All of AspectJ 1.1 is licensed under the CPL 1.0, | 
|  | so the tools, Ant tasks, and documentation are all | 
|  | in one distribution available from | 
|  | <a href="http://eclipse.org/aspectj"> | 
|  | http://eclipse.org/aspectj</a>. | 
|  | To retain their MPL 1.1 license, | 
|  | Ajde for | 
|  | <a href="http://aspectj4emacs.sourceforge.net/">Emacs</a>, | 
|  | <a href="http://aspectj4netbean.sourceforge.net/">NetBeans</a> and | 
|  | <a href="http://aspectj4jbuildr.sourceforge.net/">JBuilder</a> | 
|  | are now independent SourceForge projects. </p> | 
|  |  | 
|  | </p> | 
|  |  | 
|  |  | 
|  | <!-- ============================== --> | 
|  | <hr> | 
|  | <hr> | 
|  | <h2><a name="details">Details</a> of some language and compiler changes</h2> | 
|  |  | 
|  | <h3><a name="ASPECT_INSTANTIATION_AND_ADVICE">Aspect Instantiation | 
|  | and Advice</a></h3> | 
|  |  | 
|  | <p> In AspectJ 1.0.6, we made an effort to hide some complications | 
|  | with Aspect instantiation from the user.  In particular, the | 
|  | following code compiled and ran: | 
|  | </p> | 
|  |  | 
|  | <PRE> | 
|  | public class Client | 
|  | { | 
|  | public static void main(String[] args) { | 
|  | Client c = new Client(); | 
|  | } | 
|  | } | 
|  |  | 
|  | aspect Watchcall { | 
|  | pointcut myConstructor(): execution(new(..)); | 
|  |  | 
|  | before(): myConstructor() { | 
|  | System.err.println("Entering Constructor"); | 
|  | } | 
|  | } | 
|  | </PRE> | 
|  |  | 
|  | <p> But there's a conceptual problem with this code: The before | 
|  | advice should run before the execution of all constructors in the | 
|  | system.  It must run in the context of an instance of the | 
|  | Watchcall aspect.  The only way to get such an instance is to have | 
|  | Watchcall's default constructor execute.  But before that | 
|  | executes, we need to run the before advice...</p> | 
|  |  | 
|  | <p> AspectJ 1.0.6 hid this circularity through the ad-hoc | 
|  | mechanism of preventing an aspect's advice from matching join | 
|  | points that were within the aspect's definition, and occurred | 
|  | before the aspect was initialized.  But even in AspectJ 1.0.6, | 
|  | this circularity could be exposed: | 
|  | </p> | 
|  |  | 
|  | <PRE> | 
|  | public class Client | 
|  | { | 
|  | public static int foo() { return 3; } | 
|  | public static void main(String[] args) { | 
|  | Client c = new Client(); | 
|  | } | 
|  | } | 
|  |  | 
|  | aspect Watchcall { | 
|  | int i = Client.foo(); | 
|  | pointcut myConstructor(): | 
|  | execution(new(..)) || execution(int foo()); | 
|  |  | 
|  | before(): myConstructor() { | 
|  | System.err.println("Entering Constructor"); | 
|  | } | 
|  | } | 
|  | </PRE> | 
|  |  | 
|  | <p>This program would throw a NullPointerException when run, since | 
|  | Client.foo() was called before the Watchcall instance could be | 
|  | instantiated.  </p> | 
|  |  | 
|  | <p> In AspectJ 1.1, we have decided that half-hiding the problem | 
|  | just leads to trouble, and so we are no longer silently hiding | 
|  | some join points before aspect initialization.  However, we have | 
|  | provided a better exception than a NullPointerException for this | 
|  | case.  In AspectJ 1.1, both of the above programs will throw | 
|  | org.aspectj.lang.NoAspectBoundException. | 
|  | </p> | 
|  |  | 
|  | <h3><a name="THROWS_PATTERN">Matching based on throws</a></h3> | 
|  |  | 
|  | <p> Type patterns may now be used to pick out methods and | 
|  | constructors based on their throws clauses.  This allows the | 
|  | following two kinds of extremely wildcarded pointcuts: </p> | 
|  |  | 
|  | <pre>    pointcut throwsMathlike(): | 
|  | // each call to a method with a throws clause containing at least | 
|  | // one exception with "Math" in its name. | 
|  | call(* *(..) throws *..*Math*); | 
|  |  | 
|  | pointcut doesNotThrowMathlike(): | 
|  | // each call to a method with a throws clause containing no | 
|  | // exceptions with "Math" in its name. | 
|  | call(* *(..) throws !*..*Math*); | 
|  | </pre> | 
|  |  | 
|  | <p> The longwinded rules are that a method or constructor pattern | 
|  | can have a "throws clause pattern".  Throws clause patterns look | 
|  | like: </p> | 
|  |  | 
|  | <pre>    ThrowsClausePattern: | 
|  | ThrowsClausePatternItem ("," ThrowsClausePatternItem)* | 
|  |  | 
|  | ThrowsClausePatternItem: | 
|  | ["!"] TypeNamePattern | 
|  | </pre> | 
|  |  | 
|  | <p> A ThrowsClausePattern matches the ThrowsClause of any code | 
|  | member signature. To match, each ThrowsClausePatternItem must | 
|  | match the throws clause of the member in question. If any item | 
|  | doesn't match, then the whole pattern doesn't match. This rule is | 
|  | unchanged from AspectJ 1.0.  </p> | 
|  |  | 
|  | <p> If a ThrowsClausePatternItem begins with "!", then it matches | 
|  | a particular throws clause if and only if <em>none</em> of the | 
|  | types named in the throws clause is matched by the | 
|  | TypeNamePattern. </p> | 
|  |  | 
|  | <p> If a ThrowsClausePatternItem does not begin with "!", then it | 
|  | matches a throws clause if and only if <em>any</em> of the types | 
|  | named in the throws clause is matched by the TypeNamePattern.</p> | 
|  |  | 
|  | <p> These rules are completely backwards compatible with | 
|  | AspectJ 1.0. The rule for "!" matching has one potentially | 
|  | surprising property, in that the two PCD's shown below will have | 
|  | different matching rules. </p> | 
|  |  | 
|  | <pre>    [1] call(* *(..) throws !IOException) | 
|  | [2] call(* *(..) throws (!IOException)) | 
|  |  | 
|  | void m() throws RuntimeException, IOException {} | 
|  | </pre> | 
|  |  | 
|  | <p> [1] will NOT match the method m(), because method m's throws | 
|  | clause declares that it throws IOException. [2] WILL match the | 
|  | method m(), because method m's throws clause declares the it | 
|  | throws some exception which does not match IOException, | 
|  | i.e. RuntimeException. </p> | 
|  |  | 
|  | <h3><a name="NEW_PCDS">New kinded pointcut designators</a></h3> | 
|  |  | 
|  | <p> AspectJ 1.0 does not provide kinded pointcut designators for | 
|  | two (rarely used) join points: preinitialization (the code that | 
|  | runs before a super constructor call is made) and advice | 
|  | execution.  AspectJ 1.1 does not change the meaning of the join | 
|  | points, but provides two new pointcut designators to pick out | 
|  | these join points, thus making join points and pointcut | 
|  | designators more parallel.  </p> | 
|  |  | 
|  | <p> <code>adviceexectuion()</code> will pick out advice execution | 
|  | join points.  You will usually want to use <code>adviceexecution() | 
|  | && within(Aspect)</code> to restrict it to only those pieces of | 
|  | advice defined in a particular aspect. <br> | 
|  | <code>preinitialization(<var>ConstructorPattern</var>)</code> will | 
|  | pick out pre-initialization join points where the initialization | 
|  | process is entered through | 
|  | <code><var>ConstructorPattern</var></code>. </p> | 
|  |  | 
|  | <h3><a name="PER_TYPE">New pertype aspect specifier</a> (not in 1.1)</h3> | 
|  |  | 
|  | <p>We strongly considered adding a pertype aspect kind to 1.1. | 
|  | This is somewhat motivated by the new | 
|  | <a href="#SINGLE_INTERCLASS_TARGET">restrictions on inter-type | 
|  | declarations<a>.  This is also motivated by many previous request | 
|  | to support a common logging idiom.  Here's what pertype would look | 
|  | like:</p> | 
|  |  | 
|  | <pre>    /** One instance of this aspect will be created for each class, | 
|  | * interface or aspect in the com.bigboxco packages. | 
|  | */ | 
|  | aspect Logger pertype(com.bigboxco..*) { | 
|  | /* This field holds a logger for the class. */ | 
|  | Log log; | 
|  |  | 
|  | /* This advice will run for every public execution defined by | 
|  | * a type for which a Logger aspect has been created, i.e. | 
|  | * any type in com.bigboxco..* | 
|  | */ | 
|  | before(): execution(public * *(..)) { | 
|  | log.enterMethod(thisJoinPoint.getSignature().getName()); | 
|  | } | 
|  |  | 
|  | /* We can use a special constructor to initialize the log field */ | 
|  | public Logger(Class myType) { | 
|  | this.log = new Log(myType); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** External code could use aspectOf to get at the log, i.e. */ | 
|  | Log l = Logger.aspectOf(com.bigboxco.Foo.class).log; | 
|  | </pre> | 
|  |  | 
|  | <p>The one open question that we see is how this should interact | 
|  | with inner types.  If a pertype aspect is created for an outer | 
|  | type should advice in that aspect run for join points in inner | 
|  | types?  That is the behavior of the most common uses of this | 
|  | idiom.  </p> | 
|  |  | 
|  | <p> In any case, this feature will not be in AspectJ 1.1. | 
|  | </p> | 
|  |  | 
|  | <h3><a name="SINGLE_INTERCLASS_TARGET">One target for intertype | 
|  | declarations</a></h3> | 
|  |  | 
|  | <p> Intertype declarations (once called "introductions") in | 
|  | AspectJ 1.1 can only have one target type.  So the following code | 
|  | intended to declare that there is a void doStuff() method on all | 
|  | subtypes of Target is not legal AspectJ 1.1 code. | 
|  | </p> | 
|  |  | 
|  | <pre>    aspect A { | 
|  | public void Target+.doStuff() { ... } | 
|  | } | 
|  | </pre> | 
|  |  | 
|  | <p> The functionality of "multi-intertype declarations" can be | 
|  | recovered by using a helper interface. | 
|  | </p> | 
|  |  | 
|  | <pre>    aspect A { | 
|  | private interface MyTarget {} | 
|  | declare parents:  Target+ implements MyTarget; | 
|  | public void MyTarget.doStuff() { ... } | 
|  | } | 
|  | </pre> | 
|  |  | 
|  | <p> We believe this is better style in AspectJ 1.0 as well, as it | 
|  | makes clear the static type of "this" inside the method body. | 
|  | </p> | 
|  |  | 
|  | <p> The one piece of functionality that can not be easily | 
|  | recovered is the ability to add static fields to many classes.  We | 
|  | believe that the <a href="#PER_TYPE">pertype proposal</a> provides | 
|  | this functionality in a much more usable form.</p> | 
|  |  | 
|  | <h3><a name="UNAVAILABLE_JOIN_POINTS">No initializer execution join | 
|  | points</a></h3> | 
|  |  | 
|  | <p> AspectJ 1.1 does not consider initializer execution a | 
|  | principled join point.  The collection of initializer code (the | 
|  | code that sets fields with initializers and the code in non-static | 
|  | initializer blocks) is something that makes sense only in Java | 
|  | source code, not in Java bytecode.  </p> | 
|  |  | 
|  | <h3><a name="AFTER_HANDLER"></a>No after or around advice on handler | 
|  | join points</h3> | 
|  |  | 
|  | <p> The end of an exception handler is underdetermined in bytecode, | 
|  | so ajc will not implement after or around advice on handler join | 
|  | points, instead signaling a compile-time error.</p> | 
|  |  | 
|  | <h3><a name="CONSTRUCTOR_EXECUTION_IS_BIGGER">Initializers run | 
|  | inside constructor execution join points</a></h3> | 
|  |  | 
|  | <p> The code generated by the initializers in Java source code now | 
|  | runs inside of constructor execution join points.  This changes | 
|  | how before advice runs on constructor execution join points. | 
|  | Consider: </p> | 
|  |  | 
|  | <pre>    class C { | 
|  | C() { } | 
|  | String id = "identifier"; // this assignment | 
|  | // has to happen sometime | 
|  | } | 
|  | aspect A { | 
|  | before(C c) this(c) && execution(C.new()) { | 
|  | System.out.println(c.id.length()); | 
|  | } | 
|  | } | 
|  | </pre> | 
|  |  | 
|  | <p> In AspectJ 1.0, this will print "10", since id is assigned its | 
|  | initial value prior to the before advice's execution.  However, in | 
|  | AspectJ 1.1, this will throw a NullPointerExcception, since "id" | 
|  | does not have a value prior to the before advice's execution. | 
|  | </p> | 
|  |  | 
|  | <p> Note that the various flavors of after returning advice are | 
|  | unchanged in this respect in AspectJ 1.1.  Also note that this | 
|  | only matters for the execution of constructors that call a | 
|  | super-constructor.  Execution of constructors that call a | 
|  | this-constructor are the same in AspectJ 1.1 as in AspectJ 1.0. | 
|  | </p> | 
|  |  | 
|  | <p> We believe this difference should be minimal to real programs, | 
|  | since programmers using before advice on constructor execution | 
|  | must always assume incomplete object initialization, since the | 
|  | constructor has not yet run.  </p> | 
|  |  | 
|  | <h3><a name="INTER_TYPE_FIELD_INITIALIZERS">Inter-type field initializers</a></h3> | 
|  |  | 
|  | <p> The initializer, if any, of an inter-type field definition runs | 
|  | before the class-local initializers of its target class.  </p> | 
|  |  | 
|  | <p> In AspectJ 1.0.6, such an initializer would run after the | 
|  | initializers of a class but before the execution of any of its | 
|  | constructor bodies.  As already discussed in the sections about | 
|  | <a href="#UNAVAILABLE_JOIN_POINTS">initializer execution join | 
|  | points</a> and <a href="#CONSTRUCTOR_EXECUTION_IS_BIGGER">constructor | 
|  | execution</a>, the point in code between the initializers of a class | 
|  | and its constructor body is not principled in bytecode.  So we had a | 
|  | choice of running the initializer of an inter-type field definition at | 
|  | the beginning of initialization (i.e., before initializers from | 
|  | the target class) or at the end (i.e., just before its called | 
|  | constructor exits).  We chose the former, having this pattern in mind: | 
|  | </p> | 
|  |  | 
|  | <PRE> | 
|  | int C.methodCount = 0; | 
|  | before(C c): this(c) && execution(* *(..)) { c.methodCount++; } | 
|  | </PRE> | 
|  |  | 
|  | <p> We felt there would be too much surprise if a constructor called a | 
|  | method (thus incrementing the method count) and then the field was | 
|  | reset to zero after the constructor was done. | 
|  | </p> | 
|  |  | 
|  | <h3><a name="WITHIN_MEMBER_TYPES">Small limitations of the within | 
|  | pointcut</a></h3> | 
|  |  | 
|  | <p>Because of the guarantees made (and not made) by the Java | 
|  | classfile format, there are cases where AspectJ 1.1 cannot | 
|  | guarantee that the within pointcut designator will pick out all | 
|  | code that was originally within the source code of a certain | 
|  | type. | 
|  | </p> | 
|  |  | 
|  | <p> The non-guarantee applies to code inside of anonymous and | 
|  | local types inside member types.  While the within pointcut | 
|  | designator behaves exactly as it did in AspectJ 1.0 when given a | 
|  | package-level type (like C, below), if given a member-type (like | 
|  | C.InsideC, below), it is not guaranteed to capture code in | 
|  | contained local and anonymous types.  For example: </p> | 
|  |  | 
|  | <pre>    class C { | 
|  | Thread t; | 
|  | class InsideC { | 
|  | void setupOuterThread() { | 
|  | t = new Thread( | 
|  | new Runnable() { | 
|  | public void run() { | 
|  | // join points with code here | 
|  | // might not be captured by | 
|  | // within(C.InsideC), but are | 
|  | // captured by within(C) | 
|  | System.out.println("hi"); | 
|  | } | 
|  | }); | 
|  | } | 
|  | } | 
|  | } | 
|  | </pre> | 
|  |  | 
|  | <p> We believe the non-guarantee is small, and we haven't verified | 
|  | that it is a problem in practice.  </p> | 
|  |  | 
|  | <h3><a name="WITHIN_CODE">Small limitations of the withincode | 
|  | pointcut</a></h3> | 
|  |  | 
|  | <p>The withincode pointcut has similar issues to those described | 
|  | above for within. | 
|  | </p> | 
|  |  | 
|  | <h3><a name="INSTANCEOF_ON_WILD">Can't do instanceof matching on | 
|  | type patterns with wildcard</a></h3> | 
|  |  | 
|  | <p>The pointcut designators this, target and args specify a | 
|  | dynamic test on their argument.  These tests can not be performed | 
|  | on type patterns with wildcards in them.  The following code that | 
|  | compiled under 1.0 will be an error in AspectJ-1.1:</p> | 
|  |  | 
|  | <pre>    pointcut oneOfMine(): this(com.bigboxco..*); | 
|  | </pre> | 
|  |  | 
|  | <p>The only way to implement this kind of matching in a modular | 
|  | way would be to use the reflection API at runtime on the Class of | 
|  | the object.  This would have a very high performance cost and | 
|  | possible security issues.  There are two good work-arounds.  If | 
|  | you control the source or bytecode to the type you want to match | 
|  | then you can use declare parents, i.e.:</p> | 
|  |  | 
|  | <pre>    private interface OneOfMine {} | 
|  | declare parents: com.bigboxco..* implements OneOfMine; | 
|  | pointcut oneOfMine(): this(OneOfMine); | 
|  | </pre> | 
|  |  | 
|  | <p>If you want the more dynamic matching and are willing to pay | 
|  | for the performance, then you should use the Java reflection API | 
|  | combined with if.  That would look something like:</p> | 
|  |  | 
|  | <pre>    pointcut oneOfMine(): this(Object) && | 
|  | if(classMatches("com.bigboxco..*", | 
|  | thisJoinPoint.getTarget().getClass())); | 
|  |  | 
|  | static boolean classMatches(String pattern, Class _class) { | 
|  | if (patternMatches(pattern, _class.getName())) return true; | 
|  | ... | 
|  | } | 
|  | </pre> | 
|  |  | 
|  | <p>Note: wildcard type matching still works in all other PCD's that | 
|  | match based on static types.  So, you can use | 
|  | 'within(com.bigboxco..*+)' to match any code lexically within one | 
|  | of your classes or a subtype thereof.  This is often a good | 
|  | choice.</p> | 
|  | </p> | 
|  |  | 
|  |  | 
|  | <h3><a name="NO_SOURCE_COLUMN">SourceLocation.getColumn()</a></h3> | 
|  |  | 
|  | <p>The Java .class file format contains information about the | 
|  | source file and line numbers of its contents; however, it has no | 
|  | information about source columns.  As a result, we can not | 
|  | effectively support the access of column information in the | 
|  | reflection API.  So, any calls to | 
|  | thisJoinPoint.getSourceLocation().getColumn() will be marked as | 
|  | deprecated by the compiler, and will always return 0.</p> | 
|  |  | 
|  | <h3><a name="ASPECT_PRECEDENCE">Aspect precedence</a></h3> | 
|  |  | 
|  | <p> AspectJ 1.1 has a new declare form: | 
|  | </p> | 
|  |  | 
|  | <pre>    declare precedence ":"  TypePatternList ";" | 
|  | </pre> | 
|  |  | 
|  | <p> This is used to declare advice ordering constraints on join | 
|  | points.  For example, the constraints that (1) aspects that have | 
|  | Security as part of their name should dominate all other aspects, and | 
|  | (2) the Logging aspect (and any aspect that extends it) should | 
|  | dominate all non-security aspects, can be expressed by: </p> | 
|  |  | 
|  | <pre>    declare precedence: *..*Security*, Logging+, *; | 
|  | </pre> | 
|  |  | 
|  | <p> In the TypePatternList, the wildcard * means "any type not matched | 
|  | by another type in the declare precedence".  </p> | 
|  |  | 
|  | <h4>Various cycles</h4> | 
|  |  | 
|  | <p> It is an error for any aspect to be matched by more than one | 
|  | TypePattern in a single declare precedence, so: </p> | 
|  |  | 
|  | <pre>      declare precedence:  A, B, A ;  // error | 
|  | </pre> | 
|  |  | 
|  | <p> However, multiple declare precedence forms may legally have this | 
|  | kind of circularity.  For example, each of these declare precedence is | 
|  | perfectly legal: | 
|  | </p> | 
|  |  | 
|  | <pre>      declare precedence: B, A; | 
|  | declare precedence: A, B; | 
|  | </pre> | 
|  |  | 
|  | <p> And a system in which both constraints are active may also be | 
|  | legal, so long as advice from A and B don't share a join point.  So | 
|  | this is an idiom that can be used to enforce that A and B are strongly | 
|  | independent.  </p> | 
|  |  | 
|  | <h4>Applies to concrete aspects</h4> | 
|  |  | 
|  | <p> Consider the following library aspects: | 
|  | </p> | 
|  |  | 
|  | <pre>      abstract aspect Logging { | 
|  | abstract pointcut logged(); | 
|  |  | 
|  | before(): logged() { | 
|  | System.err.println("thisJoinPoint: " + thisJoinPoint); | 
|  | } | 
|  | } | 
|  |  | 
|  | aspect MyProfiling { | 
|  | abstract pointcut profiled(); | 
|  |  | 
|  | Object around(): profiled() { | 
|  | long beforeTime = System.currentTimeMillis(); | 
|  | try { | 
|  | return proceed(); | 
|  | } finally { | 
|  | long afterTime = System.currentTimeMillis(); | 
|  | addToProfile(thisJoinPointStaticPart, | 
|  | afterTime - beforeTime); | 
|  | } | 
|  | } | 
|  | abstract void addToProfile( | 
|  | org.aspectj.JoinPoint.StaticPart jp, | 
|  | long elapsed); | 
|  | } | 
|  | </pre> | 
|  |  | 
|  | <p> In order to use either aspect, they must be extended with | 
|  | concrete aspects, say, MyLogging and MyProfiling.  In AspectJ | 
|  | 1.0, it was not possible to express that Logging's advice (when | 
|  | concerned with the concrete aspect MyLogging) dominated | 
|  | Profiling's advice (when concerned with the concrete aspect | 
|  | MyProfiling) without adding a dominates clause to Logging | 
|  | itself.  In AspectJ 1.1, we can express that constraint with a | 
|  | simple: </p> | 
|  |  | 
|  | <pre>      declare precedence: MyLogging, MyProfiling; | 
|  | </pre> | 
|  |  | 
|  | <h4>Changing order of advice for sub-aspects</h4> | 
|  |  | 
|  | <p> By default, advice in a sub-aspect has more precedence than | 
|  | advice in a super-aspect.  One use of the AspectJ 1.0 dominates | 
|  | form was to change this precedence: | 
|  | </p> | 
|  |  | 
|  | <pre>      abstract aspect SuperA dominates SubA { | 
|  | pointcut foo(): ... ; | 
|  |  | 
|  | before(): foo() { | 
|  | // in AspectJ 1.0, runs before the advice in SubA | 
|  | // because of the dominates clause | 
|  | } | 
|  | } | 
|  |  | 
|  | aspect SubA extends SuperA { | 
|  | before(): foo() { | 
|  | // in AspectJ 1.0, runs after the advice in SuperA | 
|  | // because of the dominates clause | 
|  | } | 
|  | } | 
|  | </pre> | 
|  |  | 
|  | <p> This no longer works in AspectJ 1.1, since declare precedence only | 
|  | matters for concrete aspects.  Thus, if you want to regain this kind | 
|  | of precedence change, you will need to refactor your aspects. | 
|  | </p> | 
|  |  | 
|  | <h3><a name="SOURCEROOT">The -sourceroots option</a></h3> | 
|  |  | 
|  | <p> The AspectJ 1.1 compiler now accepts a -sourceroots option used to | 
|  | pass all .java files in particular directories to the compiler.  It | 
|  | takes either a single directory name, or a list of directory names | 
|  | separated with the CLASSPATH separator character (":" for various | 
|  | Unices, ";" for various Windows). </p> | 
|  |  | 
|  | <p> So, if you have your project separated into a gui module and a | 
|  | base module, each of which is stored in a directory tree, you might | 
|  | use one of | 
|  | </p> | 
|  |  | 
|  | <pre>    ajc -sourceroots /myProject/gui:/myProject/base | 
|  | ajc -sourceroots d:\myProject\gui;d:\myProject\base | 
|  | </pre> | 
|  |  | 
|  | <p> This option may be used in conjunction with lst files, listing | 
|  | .java files on the command line, and the -injars option. | 
|  | </p> | 
|  |  | 
|  | <h3><a name="BYTECODE_WEAVING">The -injars option</a></h3> | 
|  |  | 
|  | <p> The AspectJ 1.1 compiler now accepts an -injars option used to | 
|  | pass all .class files in a particular jar file to the compiler.  It | 
|  | takes either a single directory name, or a list of directory names | 
|  | separated with the CLASSPATH separator character (":" for various | 
|  | Unices, ";" for various Windows). </p> | 
|  |  | 
|  | <p> So, if MyTracing.java defines a trace aspect that you want to | 
|  | apply to all the classes in myBase.jar and myGui.jar, you would use | 
|  | one of: </p> | 
|  |  | 
|  | <pre>    ajc -injars /bin/myBase.jar:/bin/myGui.jar MyTracing.java | 
|  | ajc -injars d:\bin\myBase.jar;d:\bin\myGui.jar MyTracing.java | 
|  | </pre> | 
|  |  | 
|  | <p> The class files in the input jars must not have had advice woven | 
|  | into them, since AspectJ enforces the requirement that advice is woven | 
|  | into a particular classfile only once.  So if the classfiles in the | 
|  | jar file are to be created with the ajc compiler (as opposed to a pure | 
|  | Java compiler), they should not be compiled with any non-abstract | 
|  | aspects.  </p> | 
|  |  | 
|  | <p> This option may be used in conjunction with lst files, listing | 
|  | .java files on the command line, and the -sourceroots option. | 
|  | </p> | 
|  |  | 
|  | <h3><a name="OUTJAR">The -outjar option</a></h3> | 
|  |  | 
|  | <p> The -outjar option takes the name of a jar file into which the | 
|  | results of the compilation should be put.  For example: | 
|  |  | 
|  | <pre>    ajc -injars myBase.jar MyTracing.java -outjar myTracedBase.jar | 
|  | </pre> | 
|  |  | 
|  | <p> No meta information is placed in the output jar file. </p> | 
|  |  | 
|  | <h3><a name="INCREMENTAL">Incremental compilation</a></h3> | 
|  |  | 
|  | <p> The AspectJ 1.1 compiler now supports incremental compilation. | 
|  | When ajc is called with the -incremental option, it must also be | 
|  | passed a -sourceroots option specifying a directory to incrementally | 
|  | compile.  Once the initial compile is done, ajc waits for console | 
|  | input.  Every time it reads a new line (i.e., every time the user | 
|  | hits return) ajc recompiles those input files that need recompiling. | 
|  | </p> | 
|  |  | 
|  | <h4>Limitations</h4> | 
|  |  | 
|  | <p> This new functionality is still only lightly tested. </p> | 
|  |  | 
|  | <h3><a name="XNOWEAVE">-XnoWeave, a compiler option to suppress | 
|  | weaving</a></h3> | 
|  |  | 
|  | <p> The -XnoWeave option suppresses weaving, and generates | 
|  | classfiles and that can be passed to ajc again (through the | 
|  | -injars option) to generate final, woven classfiles. </p> | 
|  |  | 
|  | <p> This option was originally envisioned to be the primary way to | 
|  | generate binary aspects that could be linked with other code, and | 
|  | so it was previously (in AspectJ 1.1beta1) named | 
|  | <code>-noweave</code>.  We feel that using the | 
|  | <code><a href="#BINARY_ASPECTS">-aspectpath</a></code> option is a | 
|  | much better option.  There may still be use cases for unwoven | 
|  | classfiles, but we've moved the flag to experimental status. | 
|  | </p> | 
|  |  | 
|  | <h3><a name="BINARY_ASPECTS">-aspectpath, working with aspects in .class/.jar | 
|  | form</a> </h3> | 
|  |  | 
|  | <p> When aspects are compiled into classfiles, they include all | 
|  | information necessary for the ajc compiler to weave their advice | 
|  | and deal with their inter-type declarations.  In order for these | 
|  | aspects to have an effect on a compilation process, they must be | 
|  | passed to the compiler on the -aspectpath.  Every .jar file on | 
|  | this path will be searched for aspects and any aspects that are | 
|  | found will be enabled during the compilation.  The binary forms of | 
|  | this aspects will be untouched. </p> | 
|  |  | 
|  | <h3><a name="NO_CALLEE_SIDE_CALL">Callee-side call join | 
|  | points</a></h3> | 
|  |  | 
|  | <p> The 1.0 implementation of AspectJ, when given: | 
|  | </p> | 
|  |  | 
|  | <pre>    class MyRunnable implements Runnable { | 
|  | public void run() { ... } | 
|  | } | 
|  |  | 
|  | aspect A { | 
|  | call(): (void run()) && target(MyRunnable) { | 
|  | // do something here | 
|  | } | 
|  | } | 
|  | </pre> | 
|  |  | 
|  | <p> would cause A's advice to execute even when, say, java.lang.Thread | 
|  | called run() on a MyRunnable instance. | 
|  | </p> | 
|  |  | 
|  | <p> With the new compiler, two things have happened in regard to | 
|  | callee-side calls: | 
|  | </p> | 
|  |  | 
|  | <ol> | 
|  | <li>because the programmer has access to more code (i.e., | 
|  | bytecode, not just source code), callee-side calls are much | 
|  | less important to have.</li> | 
|  |  | 
|  | <li>because compilation is more modular, allowing and | 
|  | encouraging separate compilation, callee-side calls are much | 
|  | more difficult to implement</li> | 
|  | </ol> | 
|  |  | 
|  | <p> With these two points in mind, advice in an aspect will not be | 
|  | applied to call join points whose call site is completely | 
|  | unavailable to the aspect.  </p> | 
|  |  | 
|  | <ol> | 
|  | <li>One reason (though not the only reason) we worked so hard in | 
|  | the <em>implementation</em> of 1.0.6 to expose call join | 
|  | points, even if we only had access to the callee's code, was | 
|  | that otherwise users couldn't get access to call join points | 
|  | where the call was made from bytecode.  This is no longer the | 
|  | case.  In short, the implementation controls much more code (or | 
|  | has the capability to) than ever before.</li> | 
|  |  | 
|  | <li>The implementation model for the AspectJ 1.1 compiler is to | 
|  | separate the compilation of aspects/advice from their | 
|  | weaving/linking.  A property of the model is that the | 
|  | compilation requires no access to "target" code, only the | 
|  | weaving/linking does, and weaving/linking is inherently | 
|  | per-class local: No action at weaving/linking time depends on | 
|  | the coordinated mangling of multiple classfiles.  Rather, all | 
|  | weaving is done on a per classfile basis.  This is an essential | 
|  | property for the current separate compilation model. <br> | 
|  |  | 
|  | However, allowing implementation of call advice on either | 
|  | side requires simultaneous knowledge of both sides.  If we first | 
|  | have access to a call, we can't decide to simply put the advice | 
|  | on the call site, since later we may decide to implement on the | 
|  | callee.</li> | 
|  | </ol> | 
|  |  | 
|  | <p>This implementation decision is completely in the letter and | 
|  | the spirit of the AspectJ language.  From the semantics guide | 
|  | describing code the implementation controls:</p> | 
|  |  | 
|  | <blockquote> | 
|  | But AspectJ implementations are permitted to deviate from this | 
|  | in a well-defined way -- they are permitted to advise only | 
|  | accesses in <em>code the implementation | 
|  | controls</em>.  Each implementation is free within certain | 
|  | bounds to provide its own definition of what it means to control | 
|  | code. | 
|  | </blockquote> | 
|  |  | 
|  | <p>And about a particular decision about the 1.0.6 | 
|  | implementation:</p> | 
|  |  | 
|  | <blockquote> | 
|  | Different join points have different requirements.  Method call | 
|  | join points can be advised only if ajc controls | 
|  | <em>either</em> the code for the caller or the code | 
|  | for the receiver, and some call pointcut designators may | 
|  | require caller context (what the static type of the receiver | 
|  | is, for example) to pick out join points. | 
|  | </blockquote> | 
|  |  | 
|  | <p> The 1.1 implementation makes a different design decision: | 
|  | Method call join points can be advised only if ajc (in compiler or | 
|  | linker form) controls the code for the caller. </p> | 
|  |  | 
|  | <p>What does 1.1 gain from this?</p> | 
|  |  | 
|  | <ul> | 
|  | <li>a clear (and implemented) separate compilation model (see | 
|  | point 2, above)</li> | 
|  |  | 
|  | <li>a less confusing interaction between call join points and | 
|  | the thisJoinPoint reflective object: We still get bug reports | 
|  | about source information sometimes existing and sometimes not | 
|  | existing at call join points.</li> | 
|  | </ul> | 
|  |  | 
|  | <p> What does 1.1 lose from this?</p> | 
|  |  | 
|  | <ul> | 
|  | <li>The ability to capture all calls to Runnable.run() from | 
|  | anywhere to code ajc has access too, even from Thread, even if | 
|  | you don't compile java.lang with ajc.</li> | 
|  |  | 
|  | <li>The ability to, without access to the caller, capture entry to | 
|  | a particular method, but not super calls.</li> | 
|  |  | 
|  | <li>A code-size-improvement performance optimization.</li> | 
|  | </ul> | 
|  |  | 
|  | <p> What are the possibilities for the future?</p> | 
|  |  | 
|  | <ul> | 
|  | <li>AspectJ 1.1.1 could expand its capture of call join points, | 
|  | possibly at the expense of separate compilation clarity, | 
|  | possibly not. </li> | 
|  |  | 
|  | <li>AspectJ 1.1.1 could re-introduce reception join points from | 
|  | AspectJ 0.7 (what callee-side call join points actually are): | 
|  | though they would never ever be taught in a tutorial or | 
|  | entry-level description of the model, they may have specialized | 
|  | uses.</li> | 
|  | </ul> | 
|  |  | 
|  | <p> How will this affect developers?</p> | 
|  | <ul> | 
|  | <li>When using the call PCD but only supplying the callee | 
|  | code, supply the calling code or use the execution PCD instead. | 
|  | </li> | 
|  | </ul> | 
|  |  | 
|  | <h3><a name="OTHER_X_OPTIONS">Various -X options</a></h3> | 
|  |  | 
|  | <p> The AspectJ 1.0 compiler supported a number of options that | 
|  | started with X, for "experimental".  Some of them will not be | 
|  | supported in 1.1, either because the "experiment" succeeded (in | 
|  | which case it's part of the normal functionality) or failed. | 
|  | Others will be supported as is (or nearly so) in 1.1: | 
|  | </p> | 
|  |  | 
|  | <ul> | 
|  | <li>-XOcodeSize: This is no longer necessary because inlining | 
|  | of around advice is on by default.  We support its inverse, | 
|  | <a href="#XNOINLINE"><code>-XnoInline</code></a>. | 
|  | </li> | 
|  |  | 
|  | <li><a href="#XNOWEAVE">-XnoWeave, a compiler option to suppress | 
|  | weaving</a></li> | 
|  |  | 
|  | <li>-XtargetNearSource: Not supported in this release. </li> | 
|  |  | 
|  | <li>-XserializableAspects: Supported. </li> | 
|  |  | 
|  | <li>-XaddSafePrefix: This option will not be supported in 1.1 at | 
|  | all because we're now always using (what we believe to be) safe | 
|  | prefixes. </li> | 
|  |  | 
|  | <li>-Xlint: Still supported, with <a href="#XLINT">various | 
|  | options</a>. </li> | 
|  | </ul> | 
|  |  | 
|  | <h3><a name="ERROR_MESSAGES">Some confusing error messages</a></h3> | 
|  |  | 
|  | <p>Building on the eclipse compiler has given us access to a very | 
|  | sophisticated problem reporting system as well as highly optimized | 
|  | error messages for pure Java code.  Often this leads to noticeably | 
|  | better error messages than from ajc-1.0.6.  However, when we don't | 
|  | handle errors correctly this can sometimes lead to cascading error | 
|  | messages where a single small syntax error will produce dozens of | 
|  | other messages.  Please report any very confusing error messages as | 
|  | bugs.</p> | 
|  |  | 
|  |  | 
|  | <h3><a name="MESSAGE_CONTEXT">Source code context is not shown | 
|  | for errors and warnings detected during bytecode weaving</a></h3> | 
|  |  | 
|  | <p>For compiler errors and warnings detected during bytecode weaving, | 
|  | source code context will not be displayed.  In particular, for declare | 
|  | error and declare warning statements, the compiler now only emits the | 
|  | file and line.  We are investigating ways to overcome this in cases | 
|  | where the source code is available; in cases where source code is | 
|  | not available, we might specify the signature of the offending code. | 
|  | For more information, see bug 31724.</p> | 
|  |  | 
|  |  | 
|  | <h3><a name="XLINT">The -Xlint option</a></h3> | 
|  |  | 
|  | <p><code>-Xlint:ignore,error,warning</code> will set the level for | 
|  | all Xlint warnings.  <code>-Xlint</code>, alone, is an | 
|  | abbreviation for <code>-Xlint:warning</code>.</p> | 
|  |  | 
|  | <p>The <code>-Xlintfile:lint.properties</code> allows fine-grained | 
|  | control.  In tools.jar, see | 
|  | <code>org/aspectj/weaver/XlintDefault.properties</code> for the | 
|  | default behavior and a template to copy. </p> | 
|  |  | 
|  | <p> More <code>-Xlint</code> warnings are supported now, and | 
|  | we may add disabled warnings in subsequent bug-fix releases of 1.1. | 
|  | Because the configurability allows users to turn off | 
|  | warnings, we will be able to warn about more potentially | 
|  | dangerous situations, such as the potentially unsafe casts used by | 
|  | very polymorphic uses of proceed in around advice.  </p> | 
|  |  | 
|  | <h3><a name="NO_SOURCE">Source-specific options</a></h3> | 
|  |  | 
|  | <p> Because AspectJ 1.1 does not generate source code after | 
|  | weaving, the source-code-specific options -preprocess, -usejavac, | 
|  | -nocomment and -workingdir options are meaningless and so not | 
|  | supported.  </p> | 
|  |  | 
|  | <h3><a name="NO_STRICT_LENIENT">The -strict and -lenient | 
|  | options</a></h3> | 
|  |  | 
|  | <p> Because AspectJ 1.1 uses the Eclipse compiler, which has its | 
|  | own mechanism for changing strictness, we no longer support the | 
|  | -strict and -lenient options. </p> | 
|  |  | 
|  | <h3><a name="NO_PORTING">The -porting option</a></h3> | 
|  |  | 
|  | <p> AspectJ 1.1 does not have a -porting option.</p> | 
|  |  | 
|  | <h3><a name="13_REQUIRED">J2SE 1.3 required</a></h3> | 
|  |  | 
|  | <p>Because we build on Eclipse, the compiler will no longer run | 
|  | under J2SE 1.2.  You must run the compiler (and all tools based on | 
|  | the compiler) using J2SE 1.3 or later. The code generated by the | 
|  | compiler can still run on Java 1.1 or later VM's if compiled against | 
|  | the correct runtime libraries.</p> | 
|  |  | 
|  | <h3><a name="DEFAULT_CONSTRUCTOR_CONFLICT">Default | 
|  | constructors</a></h3> | 
|  |  | 
|  | <p> AspectJ 1.1 does not allow the inter-type definition of a | 
|  | zero-argument constructor on a class with a visible default | 
|  | constructor.  So this is no longer allowed: </p> | 
|  |  | 
|  | <PRE> | 
|  | class C {} | 
|  |  | 
|  | aspect A { | 
|  | C.new() {}  // was allowed in 1.0.6 | 
|  | // is a "multiple definitions" conflict in 1.1 | 
|  | } | 
|  | </PRE> | 
|  |  | 
|  | <p> In the Java Programming Language, a class defined without a | 
|  | constructor actually has a "default" constructor that takes no | 
|  | arguments and just calls <code>super()</code>.  </p> | 
|  |  | 
|  | <p> This default constructor is a member of the class like any other | 
|  | member, and can be referenced by other classes, and has code generated | 
|  | for it in classfiles.  Therefore, it was an oversight that AspectJ | 
|  | 1.0.6 allowed such an "overriding" inter-type constructor definition. | 
|  | </p> | 
|  |  | 
|  | <h3><a name="SUPER_IFACE_INITS">Initialization join points for | 
|  | super-interfaces</a></h3> | 
|  |  | 
|  | <p> In AspectJ, interfaces may have non-static members due to | 
|  | inter-type declarations.  Because of this, the semantics of AspectJ | 
|  | defines the order that initializer code for interfaces is run. | 
|  | </p> | 
|  |  | 
|  | <p> In the semantics document for AspectJ 1.0.6, the following | 
|  | promises were made about the order of this initialization: | 
|  | </p> | 
|  |  | 
|  | <ol> | 
|  | <li>a supertype is initialized before a subtype</li> | 
|  | <li>initialized code runs only once</li> | 
|  | <li>initializers for supertypes run in left-to-right order</li> | 
|  | </ol> | 
|  |  | 
|  | <p> The first two properties are important and are preserved in | 
|  | AspectJ 1.1, but the third property is and was ludicrous, and was | 
|  | never properly implemented (and never could be) in AspectJ 1.0.6. | 
|  | Consider: </p> | 
|  |  | 
|  | <PRE> | 
|  | interface Top0 {} | 
|  | interface Top1 {} | 
|  | interface I extends Top0, Top1 {} | 
|  | interface J extends Top1, Top0 {} | 
|  |  | 
|  | class C implements I, J {} | 
|  | // I says Top0's inits must run before Top1's | 
|  | // J says Top1's inits must run before Top0's | 
|  |  | 
|  | aspect A { | 
|  | int Top0.i = foo("I'm in Top0"); | 
|  | int Top1.i = foo("I'm in Top1"); | 
|  | static int foo(String s) { | 
|  | System.out.println(s); | 
|  | return 37; | 
|  | } | 
|  | } | 
|  | </PRE> | 
|  |  | 
|  | <p> This was simply a bug in the AspectJ specification.  The correct | 
|  | third rule is: | 
|  | </p> | 
|  |  | 
|  | <blockquote>the initializers for a type's superclass are run before the | 
|  | initializers for its superinterfaces. | 
|  | </blockquote> | 
|  |  | 
|  |  | 
|  | <h3><a name="VOID_FIELD_SET">Field Set Join Points</a></h3> | 
|  |  | 
|  | <p> In AspectJ 1.0.6, the join point for setting a field F had, as a | 
|  | return type, F's type.  This was "java compatible" because | 
|  | field assignment in java, such as "Foo.i = 37", is in fact an | 
|  | expression, and does in fact return a value, the value that the | 
|  | field is assigned to. | 
|  | </p> | 
|  |  | 
|  | <p> This was never "java programmer compatible", however, largely | 
|  | because programmers have absorbed the good style of rarely using an | 
|  | assignment statement in a value context.  Programmers typically expect | 
|  | "Foo.i = 37" not to return a value, but to simply assign a value. </p> | 
|  |  | 
|  | <p> Thus, programmers typically wanted to write something like: | 
|  | </p> | 
|  |  | 
|  | <PRE> | 
|  | void around(): set(int Foo.i) { | 
|  | if (theSetIsAllowed()) { | 
|  | proceed(); | 
|  | } | 
|  | } | 
|  | </PRE> | 
|  |  | 
|  | <p> And were confused by it being a compile-time error.  They weren't | 
|  | confused for long, and soon adapted to writing: | 
|  | </p> | 
|  |  | 
|  | <PRE> | 
|  | int around(): set(int Foo.i) { | 
|  | if (theSetIsAllowed()) { | 
|  | return proceed(); | 
|  | } else { | 
|  | return Foo.i; | 
|  | } | 
|  | } | 
|  | </PRE> | 
|  |  | 
|  | <p> But there was definitely a short disconnect.  </p> | 
|  |  | 
|  | <p> On top of that, we were never shown a convincing use-case for | 
|  | returning an interesting value from a set join point.  When we | 
|  | revisited this issue, in fact, we realized we had a long-standing bug | 
|  | in 1.0.6 dealing with the return value of pre-increment expressions | 
|  | (such as ++Foo.i) that nobody had found because nobody cares about the | 
|  | return value of such join points. | 
|  | </p> | 
|  |  | 
|  | <p> So, because it's easier to implement, and because we believe that | 
|  | this is the last possibility to make the semantics more useful, we | 
|  | have made set join points have a void return type in 1.1. </p> | 
|  |  | 
|  | <h3><a name="XNOINLINE">The -XnoInline Option</a></h3> | 
|  |  | 
|  | <p> The <code>-XnoInline</code> | 
|  | option to indicate that no inlining of any kind should be done.  This | 
|  | is purely a compiler pragma:  No program semantics (apart from stack | 
|  | traces) will be changed by the presence or absence of this option. | 
|  | </p> | 
|  |  | 
|  | <h3><a name="TARGET_TYPES_MADE_PUBLIC">Target types made | 
|  | public</a></h3> | 
|  |  | 
|  | <p> Even in 1.0.6, the AspectJ compiler has occasionally needed to | 
|  | convert the visibility of a package-level class to a public one.  This | 
|  | was previously done in an ad-hoc basis that took whole-program | 
|  | analysis into account.  With the incremental compilation model of | 
|  | AspectJ 1.1, we can now specify the occasions when the compiler makes | 
|  | these visibility changes. | 
|  | </p> | 
|  |  | 
|  | <p> In particular, the types used in the <code>this</code>, | 
|  | <code>target</code>, and <code>args</code> pointcuts are made public, | 
|  | as are the super-types from <code>declare parents</code> and the | 
|  | exception type from <code>declare soft</code>. | 
|  | </p> | 
|  |  | 
|  | <p> We believe the visibility changes could be avoided in the future | 
|  | with various implementation tricks if they become a serious | 
|  | concern, but did not encounter them as such a concern when they were | 
|  | done in the 1.0.6 implementation.  </p> | 
|  |  | 
|  | <h3><a name="STRINGBUFFER">String + now advised</a></h3> | 
|  |  | 
|  | <p> In Java, the + operator sometimes results in StringBuffer objects | 
|  | being created, appended to, and used to generate a new String.  Thus, | 
|  | </p> | 
|  |  | 
|  | <PRE> | 
|  | class Foo { | 
|  | String makeEmphatic(String s) { | 
|  | return s + "!"; | 
|  | } | 
|  | } | 
|  | </PRE> | 
|  |  | 
|  | <p> is approximately the same at runtime as | 
|  | </p> | 
|  |  | 
|  | <PRE> | 
|  | class Foo { | 
|  | String makeEmphatic(String s) { | 
|  | return new StringBuffer(s).append("!").toString(); | 
|  | } | 
|  | } | 
|  | </PRE> | 
|  |  | 
|  |  | 
|  | <p> In the design process of AspectJ 1.0.6 we didn't expose those | 
|  | StringBuffer methods and constructors as join points (though we did | 
|  | discuss it), but in 1.1 we do.  </p> | 
|  |  | 
|  | <p> This change is likely to affect highly wildcarded aspects, and can | 
|  | do so in surprising ways.  In particular: | 
|  | </p> | 
|  |  | 
|  | <PRE> | 
|  | class A { | 
|  | before(int i): call(* *(int)) && args(i) { | 
|  | System.err.println("entering with " + i); | 
|  | } | 
|  | } | 
|  | </PRE> | 
|  |  | 
|  | <p> may result in a stack overflow error, since the argument to | 
|  | println is really </p> | 
|  |  | 
|  | <PRE> | 
|  | new StringBuffer("entering with ").append(i).toString() | 
|  | </PRE> | 
|  |  | 
|  | <p> which has a call to StringBuffer.append(int).  In such cases, it's | 
|  | worth restricting your pointcut, with something like one of: | 
|  | </p> | 
|  |  | 
|  | <PRE> | 
|  | call(* *(int)) && args(i) && !within(A) | 
|  | call(* *(int)) && args(i) && !target(StringBuffer) | 
|  | </PRE> | 
|  |  | 
|  | <h3><a name="ONE_FOUR_METHOD_SIGNATURES">The -1.4 flag and method signatures</a></h3> | 
|  |  | 
|  | <p> Consider the following aspect | 
|  | </p> | 
|  |  | 
|  | <PRE> | 
|  | public aspect SwingCalls { | 
|  |  | 
|  | pointcut callingAnySwing(): call(* javax.swing..*+.*(..)); | 
|  |  | 
|  | before(): callingAnySwing() { | 
|  | System.out.println("Calling any Swing"); | 
|  | } | 
|  | } | 
|  | </PRE> | 
|  |  | 
|  | <p> And then consider the two statements | 
|  | </p> | 
|  |  | 
|  | <PRE> | 
|  | JFrame frame = new JFrame(); | 
|  | frame.setTitle("Title"); | 
|  | </PRE> | 
|  |  | 
|  | <p> According to the Java Language Specification version 2, the call | 
|  | to <code>frame.setTitle("Title")</code> should always produce the | 
|  | bytecode for a call to <code>javax.swing.JFrame.setTitle</code>. | 
|  | However, older compilers (and eclipse when run without the | 
|  | <code>-1.4</code> flag) will generate the bytecode for a call to | 
|  | <code>java.awt.Frame.setTitle</code> instead since this method is not | 
|  | overriden by JFrame.  The AspectJ weaver depends on the correctly | 
|  | generated bytecode in order to match patterns like the one you show | 
|  | correctly.  </p> | 
|  |  | 
|  | <p> This is a good example of why the pattern <code>call(* *(..)) && | 
|  | target(JFrame)</code> is the recommended style.  In general, OO | 
|  | programmers don't want to care about the static type of an object at a | 
|  | call site, but only want to know the dynamic instanceof behavior which | 
|  | is what the target matching will handle.  </p> | 
|  |  | 
|  |  | 
|  | <h2><a name="knownLimitations">Known limitations</a></h2> | 
|  |  | 
|  | <p>The AspectJ 1.1.0 release contains a small number of known limitations | 
|  | relative to the AspectJ 1.1 language. | 
|  | For the most up-to-date information about known limitations in an | 
|  | AspectJ 1.1 release, see the bug database at | 
|  | <a href="http://bugs.eclipse.org/bugs">http://bugs.eclipse.org/bugs</a>, | 
|  | especially the open bugs for the | 
|  | <a href="http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=Compiler&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED"> | 
|  | compiler</a>, | 
|  | <a href="http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=IDE&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED"> | 
|  | IDE support</a>, | 
|  | <a href="http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=Doc&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED"> | 
|  | documentation</a>, and | 
|  | <a href="http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&component=Ant&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED"> | 
|  | Ant tasks</a>. | 
|  | Developers should know about bugs marked with the "info" keyword | 
|  | because those bugs reflect failures to implement the 1.1 language perfectly. | 
|  | These might be fixed during the 1.1 release cycle; find them using the query | 
|  | <a href="http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&keywords=info"> | 
|  | http://bugs.eclipse.org/bugs/buglist.cgi?product=AspectJ&keywords=info</a> | 
|  |  | 
|  | For ajc's 1.1 implementation limitations, see | 
|  | <a href="progguide/implementation.html"> | 
|  | Programming Guide Appendix: "Implementation Notes"</a>. | 
|  |  | 
|  | </p> | 
|  | </body> </html> |