Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
RE: [aspectj-users] It was related to inheritance and deprecatedmethods ...

Hi Glenn,

 

AspectJ provides a way to match based on the runtime type of arguments using args. The method execution signature matches based on the statically declared type of the method parameter. It sounds like you would like a way to match based on the static type of the parameter being passed in, but that’s not available in AspectJ. I haven’t found a need for a feature like this and I think AspectJ has to balance the benefit of adding new features with the cost of added complexity.

 

To find calls that pass a priority that’s not a level, you could match using args and make a runtime error. And as Ron DiFrango noted, you could also make it a compile-time error to construct a Priority (or even use call((Priority+ && !Level+).new(..)) for subclasses of Priority that aren’t a Level).

 


From: aspectj-users-bounces@xxxxxxxxxxx [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Glenn Farrow
Sent: Wednesday, September 20, 2006 4:33 AM
To: aspectj-users@xxxxxxxxxxx
Subject: Re: [aspectj-users] It was related to inheritance and deprecatedmethods ...

 

Ya as per my previous email I understand that it wasn't matching because the method signature for the log method specifies a Priority for the first parameter, even though that class is deprecated.  My point was that Aspectj should match based on the type of the parameter actually being passed (which is a Level).  The run time type of that parameter must be preserved in the byte code as a Level.

What if, for example to catch uses of a deprecated class, I wanted to differentiate between calls to log() that were passing in a Priority and calls that were passing in a Level?  I would have no way to do this if matching is based on the method signature and not the actual parameter types passed.


Matthew Webster wrote:


Glenn,

The first pointcut does not match because the call() PCD does not match. You have asked to match a method that takes Level as the first parameter while the method you are calling takes a Category. The match takes place at compile- not run-time. Your other pointcuts match with a run-time test because you are matching and binding with the args() PCD. They will also match the call below but the advice will not be invoked at run-time because the first argument is a Category and not a Level:

        logger.log(Priority.FATAL,"");

The following pointcut will always match without a runtime test:

        pointcut logCall() : target(Logger) && !within(LoggingAspect) && call(void log(Priority, ..));



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/[1]


Glenn Farrow <glenn@xxxxxxxxxxxxxxx>
Sent by: aspectj-users-bounces@xxxxxxxxxxx

19/09/2006 16:50

Please respond to
glenn@xxxxxxxxxxxxxxx; Please respond to
aspectj-users@xxxxxxxxxxx

To

Matthew Webster/UK/IBM@IBMGB

cc

aspectj-users@xxxxxxxxxxx

Subject

[aspectj-users] It was related to inheritance and deprecated        methods ...

 

 

 




although I believe it should still work with Level.

Here is the log4j method declaration:

               public void log(Priority p, Object message);
however Priority is deprecated so you are supposed to pass in a Level (which implements Priority).

Here is my method call:

                _logger.log(Level.ERROR, "My error message");

The following pointcut does NOT match:

   pointcut logCall(Level p) : target(Logger) && args(p, ..) && !within(LoggingAspect) && call(void log(Level, ..));

The following pointcuts DO match:  

   pointcut logCall(Level p) : target(Logger) && args(p, ..) && !within(LoggingAspect) && call(void log(..));
   pointcut logCall(Level p) : target(Logger) && args(p, ..) && !within(LoggingAspect) && call(void log(Priority p, ..));
   pointcut logCall(Level p) : target(Logger) && args(p, ..) && !within(LoggingAspect) && call(void log(Priority+ p, ..));

So even though I am passing in a Level in my method call, the fact that the method is defined to accept a (deprecated) Priority prevents the first pointcut from matching?

Also can anyone explain why the 3 pointcuts that do match all require a runtime test?

Glenn


Matthew Webster wrote:

Glenn,


Unfortunately pointcuts not matching is one of the hardest things to diagnose. Could you post you whole aspect (or as much of it as you are willing to disclose) and a full example of a join point you are trying to match. Also could you give some examples of your environment e.g. AJDT, Ant or load-time weaving.


Cheers


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/[1]

Glenn Farrow <glenn@xxxxxxxxxxxxxxx>
Sent by:
aspectj-users-bounces@xxxxxxxxxxx

19/09/2006 15:43

Please respond to
glenn@xxxxxxxxxxxxxxx; Please respond to
aspectj-users@xxxxxxxxxxx

 

To

Ron Bodkin <rbodkin@xxxxxxxxxxxxxx>

cc

aspectj-users@xxxxxxxxxxx

Subject

Re: [aspectj-users] Pointcut fails to match when arguments        combinedwith ".."

 

 

 





No, tried that too previously.  Same result.



Ron Bodkin wrote:
> I think you want args(p, ..) to match any number of arguments as long as the
> first one is a Level; args(p) will match exactly one argument of type Level.
>
> -----Original Message-----
> From:
aspectj-users-bounces@xxxxxxxxxxx
> [
mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Glenn Farrow
> Sent: Tuesday, September 19, 2006 6:33 AM
> To:
aspectj-users@xxxxxxxxxxx
> Subject: [aspectj-users] Pointcut fails to match when arguments combinedwith
> ".."
>
> Observer the following pointcut and advice which is supposed to match
> all calls to Logger.log(..).  Logger.log always takes a Level as the
> first parameter.  However the advice never gets applied.
>
>     pointcut logCall(Level p) : target(Logger) && args(p) &&
> !within(LoggingAspect) && call(void log(..));
>     before(Level p) : logCall(p) {
>         Errors.add(p);
>     }
>
> If I revise the pointcut and advice as follows it does get applied.
> AspectJ seems to be getting confused when trying to use arguments and
> specifying additional optional arguments using wildcards.
>
> pointcut logCall() : target(Logger) && !within(LoggingAspect) &&
> call(void(log(..));
> before() : logCall() {
>     dummy();
> }
>
> What's the scoop?  I've also tried the following and it doesn't match
> either:
>
>     pointcut logCall(Level p) : target(Logger) && args(p) &&
> !within(LoggingAspect) && call(void log(Level, ..));
>     before(Level p) : logCall(p) {
>         Errors.add(p);
>     }
>
>
>
>
>
> _______________________________________________
> 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
_______________________________________________
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
  

Back to the top