Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] Re: [NEWSDELIVER] Help: how to get calling class for static methods?


SunnyDay,

Use thisJoinPoint.getSignature().getDeclaringType() for the target class and thisEnclosingJoinPointStaticpart... for the caller.

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/

To:        undisclosed-recipients:;
cc:        
Subject:        [NEWSDELIVER] Help: how to get calling class for static methods?



Hello,

I am having trouble in obtaining the caller and callee's classes if a
method call is made within the caller's static method. For example:

public class A
{
                public static void call1()
                {
                                 B.changeField();
                }
}

public class B {
                public static void changeField()
                {
                                 System.out.println("from B");
                }                
}

How can I know the caller is class A and the callee is class B? I tried
the following pointcut:

pointcut staticMethodCall() : call(static * *.*(..));
               
after() : staticMethodCall()
{
                Class calleeClass = thisJoinPoint.getSignature().getDeclaringType();
                                 
       Object caller = thisJoinPoint.getThis();
                                 
                if (caller == null)
               
                                 caller = thisJoinPoint.getSourceLocation().getWithinType();
}

Here I used thisJoinPoint.getSignature().getDeclaringType() to obtain the
callee's class. But I am not sure what's the exact meaning of "Signature"
in the context of a method call. Does it always give me the type of the
callee?

For the caller, I used thisJoinPoint.getSourceLocation().getWithinType();
But what if I test a program where no source code is available? Can I
still call thisJoinPoint.getSourceLocation()?

All these seem to work for now but I am really wondering if this is a good
solution. I appreciate any advice and code snippet!

Thank you,

SunnyDay





Back to the top