Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] A question about advice

Matthew,

Your answer is very helpful. Thanks a lot!

Thanks everyone.

Cong


On Tue, 15 Mar 2005 15:35:43 +0000, Matthew Webster
<matthew_webster@xxxxxxxxxx> wrote:
> 
> 
> Cong,
> 
> In that case you have the same problem you are faced with regular Java
> where the information you need is not available from the method arguments
> and you cannot or do not wish to modify the method signature. Rather than
> modify the join point as Eric has suggested it may be more convenient to
> require the aspect to query the information it needs through the use of a
> context parameter (which we can add for free witha pointcut). We can use a
> sightly modified "this" to facilitate the query:
> 
>   public class UserRecord
>   {
>       private UserList usrlist = new UserList();
> 
>      public void run () {
> 
>           User u1 = new User("Alice");
>           User u2 = new User("Bob");
> 
>           usrlist.add(u1);
> 
>      }
> 
>      public UserList getUsrlist() {
>            return usrlist;
>      }
> 
>      public static void main(String args[]) {
>            new UserRecord().run();
>       }
>   }
> 
>   class User
>   {
>      public User (String s) {
> 
>      }
>   }
> 
>   class UserList
>   {
>      public void add (User u) {
> 
>      }
> 
>      public boolean isMember (User u) {
>            return true;
>      }
>   }
> 
>   aspect Aspect_one
>   {
>      pointcut test (UserRecord ur) :
>            call(User.new(..)) && this(ur);
> 
>      after(UserRecord ur) returning(User usr) : test(ur)
>     {
>             System.out.println("hello there");
>       if (ur.getUsrlist().isMember(usr))
>               System.out.println("The user is already in the list!");
>      }
> 
>   }
> 
> As you should be aware local variables are not available as context to
> advice unless they are the subject of a join point.
> 
> 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/
> 
> Cong <yuncong@xxxxxxxxx>@eclipse.org on 15/03/2005 15:01:00
> 
> Please respond to aspectj-users@xxxxxxxxxxx
> 
> Sent by:    aspectj-users-admin@xxxxxxxxxxx
> 
> To:    aspectj-users@xxxxxxxxxxx
> cc:
> Subject:    Re: [aspectj-users] A question about advice
> 
> Thanks, Matthew. In the example I gave, it is true that I should
> define a join point at add user method. I didn't because I think
> there're some scenarios that you may want to use an object which is
> not directly related to the join point.
> 
> Cong
> 
> On Tue, 15 Mar 2005 09:27:41 +0000, Matthew Webster
> <matthew_webster@xxxxxxxxxx> wrote:
> >
> >
> > A pointcut e.g. this/target/args can only be used to extract context that
> > is a property of the join point. In your example "UserList" is not a
> > property of the User constructor execution join point. A better aspect
> > would be one that intercepted the addition of a User object to a list:
> >
> >   public class UserRecord
> >   {
> >      public static void main(String args[])
> >      {
> >           UserList usrlist = new UserList();
> >
> >           User u1 = new User("Alice");
> >           User u2 = new User("Bob");
> >
> >           usrlist.add(u1);
> >       }
> >   }
> >
> >   class User
> >   {
> >      public User (String s) {
> >
> >      }
> >   }
> >
> >   class UserList
> >   {
> >      public void add (User u) {
> >
> >      }
> >
> >      public boolean isMember (User u) {
> >            return true;
> >      }
> >   }
> >
> >   aspect Aspect_one
> >   {
> >      pointcut test (UserList ul, User u) :
> >            call(void add(User)) && target(ul) && args(u);
> >
> >      before(UserList usrlist, User usr) : test(usrlist,usr)
> >     {
> >             System.out.println("hello there");
> >       if (usrlist.isMember(usr))
> >               System.out.println("The user is already in the list!");
> >      }
> >
> >   }
> >
> > If you want to prevent the addition of duplicates you will need to use
> > around advice with conditional "proceed" or throw a RuntimeException.
> >
> > 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/
> >
> > Cong <yuncong@xxxxxxxxx>@eclipse.org on 15/03/2005 04:25:25
> >
> > Please respond to aspectj-users@xxxxxxxxxxx
> >
> > Sent by:    aspectj-users-admin@xxxxxxxxxxx
> >
> > To:    aspectj-users@xxxxxxxxxxx
> > cc:
> > Subject:    Re: [aspectj-users] A question about advice
> >
> >
> > Thanks for your answer, Eric. For the first solution, if an updated
> > usrlist is needed, then I have to define any method call that modifies
> > the usrlist as join points. It seems not a good choice. For your
> > second solution, I don't understand it quite well.
> > "UserRecord.aspectOf().setUserList(usrlist)", to my understanding,
> > aspectOf() is used with an aspect. But UserRecord is a class. ... a
> > little bit confused *-)
> >
> > On Mon, 14 Mar 2005 20:53:25 -0600, Eric Bodden <eric@xxxxxxxxx> wrote:
> > > > This aspect contains an error - usrlist is not defined. And my
> > > > question is that is there anyway for the aspect code to get the
> > > > reference of the usrlist object defined in the main()?
> > > There are several ways to do so. You could intercept the creation of
> the
> > > list and store a reference in the aspect. Also you could explicitly
> spass
> > > the reference to the aspect using something like
> > > "UserRecord.aspectOf().setUserList(usrlist)", which of course implies
> > that
> > > you have a matching method defined in the aspect.
> > >
> > > Eric
> > >
> > > _______________________________________________
> > > 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
> >
> _______________________________________________
> 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
>


Back to the top