[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] Why is this call also matched?
|
Hi Eric,
Your explanation makes sense. Thank you very much!
Sunny
On 4/5/06, Eric Bodden <eric.bodden@xxxxxxxxxxxxxx> wrote:
This is because the AspectJ implementation in ajc makes (at least to my
best knowledge) no effort to resolve statically if a joinpoint lies
within the control flow of another joinpoint or not (or if so, this info
is apparently not exposed). Hence, there can only be a question mark
indicating that it might be in the control flow (even if at runtime it
never will).
Eric
> -----Original Message-----
> From: aspectj-users-bounces@xxxxxxxxxxx
> [mailto:
aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Sunny
> Sent: Wednesday, April 05, 2006 4:51 PM
> To: aspectj-users@xxxxxxxxxxx
> Subject: Re: [aspectj-users] Why is this call also matched?
>
> Andy,
>
> Thank you for your quick response. Yes, there is such a '?'
> against it. But why is it a conditional match (what does a
> conditionl match mean) and all other calls within the control
> flow also have such a question mark? Thanks a lot!
>
> Sunny
>
>
> On 4/5/06, Andy Clement <andrew.clement@xxxxxxxxx> wrote:
>
> Does the advice marker against the a1.call2() statement
> by any chance
> have a tiny '?' against it indicating it is a
> conditional match that
> may not actually cause the advice to run when you
> execute the program?
>
> Andy.
>
> On 05/04/06, Sunny <sunfire001@xxxxxxxxx> wrote:
> >
> >
> > Hi,
> >
> > Today I got a chance to try the solution provided by
> Adrian on Mar. 24. This
> > solution worked fine. Then I changed it a little bit
> to monitor all calls
> > with such patterns. Here I am listing the code and aspect.
> >
> > public class A
> > {
> > B b = new B();
> > public static void call1(B b)
> > {
> > C c = new C();
> > c.call2(b);
> > }
> >
> > public void call2()
> > {
> > call1(b);
> > }
> > }
> >
> > public class C
> > {
> > public void call3(B b)
> > {
> >
b.changeField();
> > }
> >
> > public static void main(String[] args)
> > {
> > A a1 = new A();
> > a1.call2();
> > }
> > }
> >
> >
> > pointcut staticCalledFromInstance(Object caller) :
> > call(static * *.*(..)) && this(caller);
> >
> > pointcut calledFromWithinStaticInCflowOfInstance(Object
> > caller) :
> > call(* *.* (..)) &&
> > cflow(staticCalledFromInstance(caller));
> >
> > before(Object caller) :
> > calledFromWithinStaticInCflowOfInstance(caller)
> > {
> > System.out.println(caller.getClass().getName());
> > }
> >
> >
> > What confuses me is that the call a1.call2() in main
> is also advised by the
> > pointcut calledFromWithinStaticInCflowOfInstance (there is
> > an advice marker next to this statement). I did not
> expect this call to be
> > advised since it is not in the control flow of call1(b);
> > which is matched by staticCalledFromInstance
> pointcut. Could someone explain
> > why this is the case?
> >
> > Thank you very much!
> >
> >
> > Sunny
> > _______________________________________________
> > aspectj-users mailing list
> > aspectj-users@xxxxxxxxxxx <mailto:aspectj-users@xxxxxxxxxxx
>
> > https://dev.eclipse.org/mailman/listinfo/aspectj-users
> >
> >
> >
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>
>
>
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users