[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
RE: [aspectj-users] Matching targets cast to a specific type
|
I seem to remember that we briefly considered a type pattern TSub, which
unlike T+ would match only subtypes of T, not T itself. I think we never
found a compelling use case.
> -----Original Message-----
> From: aspectj-users-bounces@xxxxxxxxxxx
> [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Ron Bodkin
> Sent: Tuesday, February 21, 2006 10:58 AM
> To: aspectj-users@xxxxxxxxxxx
> Subject: RE: [aspectj-users] Matching targets cast to a specific type
>
> Hi Michael,
>
> I believe that your form using an if pointcut based on
> thisJoinPointStaticPart is the only way to match the join
> points you want.
>
> If you wanted to test for calls that are or are not made to a
> method that is overridden in a subclass of Foo with a static
> reference to such a subclass, that could be done all at
> compile-time using:
>
> declare parents: Foo+ && !Foo implements SubFoo; //marker
>
> You could then match call(* Foo.*(..)) && !call(*
> SubFoo.*(..)) or call(* SubFoo.*(..)).
>
> To the question of the efficiency of the if test, I'd be
> interested in seeing performance measurements. The bytecode
> that is generated looks relatively efficient (basically 3
> method invocations and a comparison at runtime for the normal
> case), so for many uses it would be acceptable.
>
> It's worth noting that your if pointcut will actually match
> all the examples of use you gave, even those you didn't want
> to match, if there's an inter-type declaration for IFoo.foo
> and not a definition in Foo.foo ...
> i.e., it is testing for the type that is defining the method
> as well as the static type of the callee. Your pointcut works
> unless there are ITD's, because all implementers of an
> interface must implement its methods. E.g.:
>
> aspect TestPcd {
> public void IFoo.foo() {
> }
>
> pointcut IFooCall(): call(* IFoo.*(..));
> pointcut IFooOnlyCall(): IFooCall() &&
>
> if(thisJoinPointStaticPart.getSignature().getDeclaringType()==
> IFoo.class);
>
> before() : IFooOnlyCall() {
> System.err.println(thisJoinPoint);
> }
> }
>
> interface IFoo {
> public void foo();
> }
>
> class Foo implements IFoo {
> }
>
> public class MatchSuperOnly {
>
> public static void main(String arg[]) {
> match();
> nomatch();
> }
>
> private static void match() {
> IFoo f = new Foo();
> f.foo(); // this
> }
>
> private static void nomatch() {
> Foo f = new Foo();
> f.foo(); // not this
> new Foo().foo(); // or this
> }
> }
>
> java MatchSuperOnly
> call(void IFoo.foo())
> call(void IFoo.foo())
> call(void IFoo.foo())
>
> -----Original Message-----
> From: aspectj-users-bounces@xxxxxxxxxxx
> [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of
> Michael Herrmann
> Sent: Tuesday, February 21, 2006 9:30 AM
> To: aspectj-users@xxxxxxxxxxx
> Subject: [aspectj-users] Matching targets cast to a specific type
>
> Hello again,
>
> I'd like a pointcut to match if and only if the target is
> declared as(cast
> to) a specific type. I hope the following example helps
> understand what I
> mean:
>
> public interface IFoo {
> public void foo();
> }
>
> public class Foo implements IFoo {
> public void foo() {}
> }
>
> The pointcut should now match
>
> IFoo f = new Foo();
> f.foo(); // this
>
> but not
>
> Foo f = new Foo();
> f.foo(); // this
>
> or
>
> new Foo().foo();
>
>
> The following pointcut does what I want:
>
> before(): call(void IFoo.doSomething()) &&
> if(thisJoinPointStaticPart.getSignature().getDeclaringType()==
> IFoo.class)
>
> but costs performance since if(...) is evaluated at runtime.
> The information I need for picking out the right join points
> is already present at compile-time, though, so my question
> is: Is there a way of expressing this pointcut using only
> compile-time functionality?
>
> Thanks in advance,
> Michael Herrmann
>
> --
> 10 GB Mailbox, 100 FreeSMS/Monat http://www.gmx.net/de/go/topmail
> +++ GMX - die erste Adresse f|r Mail, Message, More +++
> _______________________________________________
> 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
>