Jonathan,
There be dragons! Your solution relies on a naming convention used by the
Java compiler not the JVM Specification. The subject of targeting anonymous
classes with pointcuts has been discussed before:
http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg01792.html. Trying to
refer to an anonymous class by name is a strange concept so use wildcards
instead. In the following example:
public class Test implements Runnable {
public void run () {
}
public void test () {
new Runnable () {
public void run() {
}
};
}
}
public aspect Aspect {
pointcut run () :
execution(void run()) && !within(Test.*);
before () : run () {
System.out.println(thisJoinPoint.getSignature());
}
}
the pointcut will not match the inner class.
Matthew Webster
AOSD Project
Java Technology Centre, MP146
IBM Hursley Park, Winchester, SO21 2JN, England
Telephone: +44 196 2816139 (external) 246139 (internal)
Email: Matthew Webster/UK/IBM @ IBMGB, matthew_webster@xxxxxxxxxx
http://w3.hursley.ibm.com/~websterm/
Jonathan Amir <jamir@xxxxxxxxxxxxxx>@eclipse.org on 16/09/2004 23:15:35
Please respond to aspectj-users@xxxxxxxxxxx
Sent by: aspectj-users-admin@xxxxxxxxxxx
To: aspectj-users@xxxxxxxxxxx
cc:
Subject: Re: [aspectj-users] How to advice only non-anonymous classes in
a hierarchy
Have a look at the following code:
public class Test {
public static void main(String[] args) {
new MyTopLevelElement ().aMethod();
new MyTopLevelElement () {
public void aMethod () {
System.out.println ("aMethod (overrided) from " +
getClass().getName());
}
}.aMethod();
}
}
class MyTopLevelElement {
public void aMethod () {
System.out.println ("aMethod from " + getClass().getName());
}
}
aspect NonAnonymous {
pointcut nonAnonymous (): execution(void MyTopLevelElement+.aMethod());
before (): nonAnonymous () {
System.out.println ("aspectJ in action ...");
System.out.println (thisJoinPoint.toLongString());
}
}
Running this code yields the following output:
aspectJ in action ...
execution(public void MyTopLevelElement.aMethod())
aMethod from MyTopLevelElement
aspectJ in action ...
execution(public void Test.1.aMethod())
aMethod (overrided) from Test$1
So, inner classes have a dollar sign in their name (before the last token
in their fully qualified
name. However, it seems that this $ sign disappears when aspectJ is
running.
One solution to your problem is as follows (however, it is far from being
an efficient solution):
change the pointcut declaration at the above example to this:
pointcut nonAnonymous (): execution(void MyTopLevelElement+.aMethod())
&& !execution (void *..*1.aMethod())
&& !execution (void *..*2.aMethod())
&& !execution (void *..*3.aMethod())
&& !execution (void *..*4.aMethod())
&& !execution (void *..*5.aMethod())
&& !execution (void *..*6.aMethod())
&& !execution (void *..*7.aMethod())
&& !execution (void *..*8.aMethod())
&& !execution (void *..*9.aMethod())
&& !execution (void *..*0.aMethod());
The new output now looks like this:
aspectJ in action ...
execution(public void MyTopLevelElement.aMethod())
aMethod from MyTopLevelElement
aMethod (overrided) from Test$1
This solution works even if the number associated with an inner class has
more than one digit.
Hope this helps ...
Jonathan
Marius Marin wrote:
Hello,
Is it possible in AspectJ to advice all the classes in
a class hierarchy but not the anonymous ones?
Define a pointcut like:
execution(void MyTopLevelAClass+.aMethod())
&& ??? //exclude the anonymous subclasses
Thanks,
M.
_______________________________
Do you Yahoo!?
Declare Yourself - Register online to vote today!
http://vote.yahoo.com
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users