[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
RE: [aspectj-users] Re: withincode and overriden methods
|
While I'd argue that withincode is based on lexical structure, it's
certainly a little surprising the way that signature matching works for it
(i.e., lexically contained in any method that defines or overrides).
By the way, using within(Type) && withincode(* foo()) is simpler, but it
does exclude matches of ITD's where withincode(* Type.foo()) would match,
but within(Type) might well not!
-----Original Message-----
From: aspectj-users-bounces@xxxxxxxxxxx
[mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Linton Ye
Sent: Tuesday, July 11, 2006 11:43 AM
To: aspectj-users@xxxxxxxxxxx
Subject: [aspectj-users] Re: withincode and overriden methods
thanks Ron and Matthew,
yes, that's indeed the solution based on the current semantics of
withincode in AspectJ.
Just like what I understood "within" as opposed to "this", I tended to
see "withincode" as opposed to "execution" in the same way, i.e. the
former is just about the lexical structure and won't touch sub-classes,
and the latter is about the code being executed and thus will match
sub-classes.
But "picking out execution of implementing methods on an interface" is
indeed a good use case of the current semantics of withincode. Maybe we
should say withincode is not purely lexical structure based?
Ron Bodkin wrote:
> Hi Linton,
>
> I think it's important that withincode matches statically on signatures in
> the same way that execution and call do, i.e., based on the "declaring
> type". This leads to matches for overriding methods as you've observed,
> which I think was the right choice (e.g., it makes it easy to pick out
> execution of implementing methods on an interface). Regardless this is now
> the established semantics for AspectJ and I definitely think it shouldn't
> change.
>
> However, for your requirement you could use:
>
> withincode(void Foo.bar()) && !withincode(void (Foo+ && !Foo).bar())
>
> to express the notion of within only the implementation of bar defined on
> Foo but not in overriding methods, without having to enumerate the
> subtypes...
>
> -----Original Message-----
> From: aspectj-users-bounces@xxxxxxxxxxx
> [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Linton Ye
> Sent: Monday, July 10, 2006 10:57 AM
> To: aspectj-users@xxxxxxxxxxx
> Subject: [aspectj-users] withincode and overriden methods
>
> Hi All,
>
> Please see the following code, say, I would like to capture join points
> inside the Foo.bar() method ONLY, not in any of the overridden versions.
>
> However, only pointcut 3 works. Pointcut 1 and 2 matches bar methods
> defined in both Foo and SubFoo.
>
> Compared to this, within pointcut works more like what I expected, as in
> pointcut 4, within(Foo) only matches join points in class Foo, not in
> any of its subclasses, e.g. SubFoo.
>
> Since withincode and within are used to match join points based on the
> lexical structure of the program, it seems more reasonable not to
> implicitly include the subclasses. To match subclasses, we can just use
> withincode(void Foo+.bar()).
>
> Any comments will be appreciated.
>
> public class Withincode {
> public static void main(String[] args) {
> Foo f = new SubFoo();
> f.bar();
> }
> static void log(Object...objects) {
> for(Object o:objects)
> System.out.print(o);
> System.out.println();
> }
> static class Foo {
> public void bar() {
> log("Foo");
> }
> }
> static class SubFoo extends Foo {
> public void bar() {
> log("SubFoo");
> }
> }
> static aspect SomeAspect {
> // 1
> before():withincode(void Foo.bar()){}
> // 2
> before():withincode(void (Foo && !SubFoo).bar()){}
> // 3
> before():!withincode(void SubFoo.bar())
> &&withincode(void Foo.bar()){}
> // 4
> before():within(Foo) { }
> }
> }
>
> thanks,
> linton
>
> _______________________________________________
> 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