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]
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]
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