| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> | 
 | <html> <head> | 
 | <title>AspectJ 1.6.12 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 2010-2011 Contributors. | 
 | All rights reserved. | 
 | </small></div> | 
 |  | 
 | <h1>AspectJ 1.6.12 Readme</h1> | 
 |  | 
 | <p>The full list of resolved issues in 1.6.12 is available  | 
 | <a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced;bug_status=RESOLVED;bug_status=VERIFIED;bug_status=CLOSED;product=AspectJ;target_milestone=1.6.12;">here</a></h2>.</p> | 
 |  | 
 | <h4>1.6.12 released 18-Oct-2011</h4> | 
 | <h4>1.6.12.RC1 available 3-Oct-2011</h4> | 
 | <h4>1.6.12.M2 available 18-Aug-2011</h4> | 
 | <h4>1.6.12.M1 available 7-Jun-2011</h4> | 
 |  | 
 | <h2>Notable Changes</h2> | 
 |  | 
 | <h3>RC1 - annotation value matching and !=</h3> | 
 | <p> | 
 | Prior to this change it was only possible to specify an annotation match like this:<br><br> | 
 | <tt>get(@Anno(someValue=1) * *) || get(@Anno(someValue=3) * *)</tt><br> | 
 | <p>Now it is possible to use != and write this:<br><br> | 
 | <tt>get(@Anno(someValue!=2) * *)</tt><br> | 
 | <p>This can enable a group of annotated elements to be more easily identified.<br> | 
 | <br> | 
 |  | 
 |  | 
 | <h3>RC1 - More flexible pointcut/code wiring in aop.xml</h3> | 
 | <p> | 
 | Prior to this version the wiring was quite limited.  In order to wire a pointcut to a piece of code the user | 
 | needed to write an abstract aspect that included an abstract pointcut and some advice attached to that | 
 | abstract pointcut.  Then compile this aspect and finally write the XML to concretize the abstract pointcut.  With 1.6.12 | 
 | more flexibility has been added and for some cases there can be no need for that abstract aspect. | 
 | <p>This is a work in progress but now you can write this in the aop.xml: | 
 | <pre><code> | 
 | <concrete-aspect name="MyAspect"> | 
 |   <before pointcut="execution(* Hello.say2(..)) AND args(message)" | 
 |    invokeClass="SomeRegularJavaClass"  | 
 |    invokeMethod="someMethod(JoinPoint tjp, java.lang.String message)"/> | 
 |   <after pointcut="execution(* Hello.say2(..)) AND args(message)" | 
 |    invokeClass="SomeRegularJavaClass"  | 
 |    invokeMethod="someOtherMethod(JoinPoint tjp, java.lang.String message)"/> | 
 | </concrete-aspect> | 
 |  | 
 | public class SomeRegularJavaClass { | 
 |  | 
 |   public static void someMethod(org.aspectj.lang.JoinPoint tjp, String s) { | 
 |     System.out.println("in advice4: s="+s+" at "+tjp); | 
 |   } | 
 |    | 
 |   public static void someOtherMethod(org.aspectj.lang.JoinPoint tjp, String s) { | 
 |     System.out.println("in advice5: s="+s+" at "+tjp); | 
 |   } | 
 | } | 
 | </code></pre> | 
 | <p>In this example there is a simple regular java class containing some static methods.  In the XML these | 
 | can be joined to pointcuts, kind as if they were advice.  Notice in the XML it specifies: | 
 | <ul> | 
 | <li>The pointcut | 
 | <li>The <tt>invokeClass</tt> - the fully qualified name of the class containing the Java method | 
 | <li>The <tt>invokeMethod</tt> - the method, including signature in the specified class. | 
 | </ul> | 
 | <p> | 
 | Due to the method specification being in XML the parameter types must be fully specified.  The only | 
 | exception to this rule is that the AspectJ core types JoinPoint (and JoinPoint.StaticPart) do not | 
 | have to be fully qualified (see the example above). | 
 | <b>Important:</b> notice that in the case above which does argument binding, the names are | 
 | bound according to the XML specification, not according to the parameter names in the Java code. | 
 | <p>Around advice is also supported (the return type of the method must match the joinpoint return | 
 | type).  The example shows after advice, currently there is no way to specify either after returning | 
 | or after finally, there is only after. | 
 | <p>Expanding this further would enable support for all the code style features in the XML.  Some | 
 | of the language features like declare annotation cannot be done in annotation style aspects but the | 
 | XML doesn't have the same kind of restrictions.  If anyone wants to help out by fleshing this area | 
 | of the weaver out, let me know and I'll help you get started! | 
 |    | 
 | <hr> | 
 | <h3>M2 - thisAspectInstance (<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=239649">bug239649</a>)</h3> | 
 | <p> | 
 | There is now a new well known name that you can use in the if clauses in your aspects.  <tt>thisAspectInstance</tt> provides access to the aspect instance. | 
 |  | 
 | Here is an example: | 
 |  | 
 | <code><pre>aspect X { | 
 |   boolean doit() { | 
 |     System.out.println("In instance check method doit()"); | 
 |     return true; | 
 |   } | 
 |  | 
 |   before():execution(* m(..)) && if(thisAspectInstance.doit()){ | 
 |     System.out.println(thisJoinPoint); | 
 |   } | 
 | }</pre></code> | 
 |  | 
 | <p>Now why not just use <tt>X.aspectOf()</tt> instead of <tt>thisAspectInstance</tt>?  Well <tt>thisAspectInstance</tt> is quite useful  | 
 | when working with abstract/concrete aspects: | 
 |  | 
 | <code><pre> | 
 | abstract aspect X { | 
 | abstract pointcut p(); | 
 |  | 
 | boolean doit() { | 
 |     return true; | 
 |   } | 
 |  | 
 |   before():p()  && if(thisAspectInstance.doit()){ | 
 |     System.out.println(thisJoinPoint); | 
 |   } | 
 | } | 
 |  | 
 | aspect Y extends X { | 
 |  | 
 |   pointcut p(): execution(* m(..)); | 
 |  | 
 | }</pre></code> | 
 |  | 
 | <p>Now <tt>thisAspectInstance</tt> will be an instance of the Y, not X. | 
 |  | 
 | It enables the aspect instance to be used in some kind of check/guard that will avoid the costly creation of a thisJoinPoint object if | 
 | the advice isn't going to run. | 
 |  | 
 | <b>Note:</b> right now this only works for singleton aspects.  If you have need of it with other instantiation models, please comment on | 
 | <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=239649">https://bugs.eclipse.org/bugs/show_bug.cgi?id=239649</a> | 
 | </p> | 
 | <h3>M2 - weaving groovy</h3> | 
 | <p> | 
 | Although we have been successfully weaving groovy for a long time, it is becoming more popular and a few issues have been uncovered | 
 | when using non-singleton aspects with groovy code.  These have been fixed. | 
 | </p> | 
 |  | 
 | <h3>M2 - AJDT memory</h3> | 
 | <p> | 
 | The release notes for the last few versions of AspectJ have mentioned two options (minimalModel and typeDemotion) which can be | 
 | switched on to reduce memory consumption.  They have had enough field testing now and from 1.6.12.M2 onwards they are on by default. | 
 | Users should see a reduction in memory consumed by AspectJ projects in AJDT.  It won't affect load time weaving.  It may also help | 
 | command line (or Ant) compile time weaving.  If these options cause a problem then please raise a bugzilla but in the interim you could | 
 | work around the problem by actively turning them off by  | 
 | specifying <tt>-Xset:minimalModel=false,typeDemotion=false</tt> in the project properties for your AspectJ project. | 
 | </p> | 
 |  | 
 | <h3>M2 - Java7 weaving support</h3> | 
 | <p>Some preliminary work has been done to support Java7.  Java7 class files must contain the necessary extra verifier support attributes  | 
 | in order to load successfully on a Java7 VM - the attributes were only optional in Java6.  It is possible to force loading of classes missing  | 
 | the attributes but that requires use of a -XX option.  AspectJ 1.6.12.M2 should create these for you if you weave Java7 level class | 
 | files.  Nothing has been done yet to rebase AspectJ on a version of the Eclipse compiler that supports Java7 language constructs -  | 
 | that will happen after Eclipse 3.7.1 is out. | 
 | </p> | 
 |  | 
 | <hr> | 
 | <h3>M1 - synthetic is supported in pointcut modifiers <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=327867">327867</a></h3> | 
 | <p>It is now possible to specify synthetic in pointcuts: | 
 | </p> | 
 | <pre><code>pointcut p(): execution(!synthetic * *(..)); | 
 | </code></pre> | 
 |  | 
 | <h3>M1 - respect protection domain when generating types during weaving <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=328099">328099</a></h3> | 
 | <p>This enables us to weave signed jars correctly.  AspectJ sometimes generates closure classes during weaving and | 
 | these must be defined with the same protection domain as the jar that gave rise to them.  In 1.6.12.M1 this should | 
 | now work correctly. | 
 | </p> | 
 |  | 
 | <h3>M1 - Suppressions inline with the JDT compiler <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=335810">335810</a></h3> | 
 | <p>Starting with Eclipse 3.6, the Eclipse compiler no longer suppresses raw type  | 
 | warnings with @SuppressWarnings("unchecked"). You need to use  | 
 | @SuppressWarnings("rawtypes") for that.  AspectJ has now been updated with this rule too. | 
 | </p> | 
 |  | 
 | <h3>M1 - Optimized annotation value binding for ints <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=347684">347684</a></h3> | 
 | <p>The optimized annotation value binding now supports ints - this is for use when you want to match upon the existence of an annotation but | 
 | you don't need the annotation, you just need a value from it. This code snippet shows an example:</p> | 
 | <pre><code>@interface SomeAnnotation { | 
 |   int i(); | 
 | } | 
 |  | 
 | before(int i): execution(* *(..)) && @annotation(SomeAnnotation(i)) { | 
 | </code></pre> | 
 | <p> | 
 | Binding values in this way will result in code that runs *much* faster than using pointcuts that  | 
 | bind the annotation itself then pull out the value. | 
 | </p> | 
 |  | 
 | <p>Under that same bug some changes were made to match values by name when binding too.  Suppose the annotation | 
 | had multiple int values, how would we select which int to bind?  AspectJ will now use the name (if it can) to select | 
 | the right value: | 
 | <pre><code>@interface SomeAnnotation { | 
 |   int mods(); | 
 |   int flags(); | 
 | } | 
 |  | 
 | before(int flags): execution(* *(..)) && @annotation(SomeAnnotation(flags)) { | 
 | </code></pre> | 
 | <p>Here the use of 'flags' as the name of the value being bound will ensure the 'flags' value from any SomeAnnotation is | 
 | bound and not the 'mods' value.</p> | 
 |  | 
 |  | 
 | <h4> | 
 | <!-- ============================== -->   | 
 | </body> | 
 | </html> |