[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] MethodPattern for Methods with arguments without wildcard '..'
|
Hi,
The call pointcut takes a declared signature. You have to specify the
pattern that would match the declared method. The contains method
takes an Object , so "call(* Collection.contains(Object))" will match
it. Both these work for me:
before(Collection c, String s): target(c) && args(s) && call(*
Collection.contains(Object)) {}
before(Collection c, String s): target(c) && args(s) && call(*
Collection.contains(Object+)) {}
Of course the original method was declared generically but the erasure
of the declaration is Object (as you can see with javap on
Collection).
You did mention Object+ didn't work for you, which confuses me - did
you have exactly what I show above?
You also say how do you test the runtime type without exposing it:
before(Collection c): target(c) && args(String) && call(*
Collection.contains(Object)) {}
this/target/args check runtime type information.
Andy
2009/12/10 <jbresson@xxxxxxxxxx>:
> Hi,
>
> I am looking for the point-cut for contains method (line 9) in the following
> Java code:
>
> Collection<String> c;
> c = new ArrayList<String>();
> c.add("x");
> c.add("y");
>
> String s;
> s = "z";
>
> if(!c.contains(s)) {
> c.add(s);
> }
>
>
> This Pointcut works:
>
> public aspect DequeAspect {
>
> pointcut test(Collection c, String s): target(c) &&
> args(s) &&
> call(* Collection.contains(..));
>
> after(Collection c, String s): test(c, s) {
> System.err.println("AFTER: "+c.toString()+" CONTAINS "+s);
> }
> }
>
>
> After a look at the page <Appendix B. Language Semantics>
> http://www.eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html
>
> It seems to be that the wildcard '..' in the contains Method can also be a
> TypePattern.
>
> But I tested :
> pointcut test(Collection c, String s): target(c) && args(s) &&
> call(*
> Collection.contains(String));
>
> and that is not working (I also tried Object+ or String+).
>
>
> In this example, using the wildcard is not big deal, but what if you just
> want to test the Type of the argument (without exposing this values) :
> pointcut test(Collection c): target(c) &&
> call(* Collection.contains(String));
>
> produce a AdviceDidNotUsed warning (on the Advice using this pointcut)
>
>
> How do you define correctly the MethodPattern (especially the TypePattern)
> without the wildcard '..'? Is that possible?
>
>
> Regards,
>
> Jérémie
>
>
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>