user234194
user234194

Reputation: 1723

java question to decide who called this method

I have the following scenario where both testOne() and testTwo calls same callMe() method.

How do I decide inside callMe() method who called callMe().

public void testOne(){
    callMe();
}

public void testTwo(){
    callMe();
}

public void callMe(){
    System.out.println("I was called by following method."+methodName);     

}


Any sort of help is appreciated.

Upvotes: 0

Views: 259

Answers (4)

Kainsin
Kainsin

Reputation: 447

My best answer is to query the stack trace.

StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
String previousMethodName = null;

for (int i = 0; (i < stackTrace.length) && (previousMethodName == null); i++)
{
    if (stackTrace[i].getMethodName().equals("callMe") && (i < stackTrace.length - 1))
    {
        previousMethodName = stackTrace[i + 1].getMethodName();
    }
}

if (previousMethodName != null)
{
    System.out.println("Previous method = " + previousMethodName);
}

Upvotes: 2

Peter Lawrey
Peter Lawrey

Reputation: 533720

The simplest approach is to use a parameter

public static void testOne(){
    callMe("testOne");
}

public static void testTwo(){
    callMe("testTwo");
}

public static void callMe(){
    System.out.println("I was called by following method."+methodName);     
}

However, you can use the call stack.

public static void callMe(){
    String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();
    System.out.println("I was called by following method."+methodName);
}

Upvotes: 1

marcelog
marcelog

Reputation: 7180

sorry, i meant to answer your question and not comment :( so here it is

i think this already answered question may help you out: Get current stack trace in Java

Upvotes: 1

matt b
matt b

Reputation: 140001

Any solution that has you generating a stacktrace and looking at the second frame is one that is going to lead to pain - what you are essentially doing is bypassing the idea of passing what a function needs to it in order for the function to do it's work.

If you need the name of the caller method, then just pass it as a parameter. If you need some other piece of data to decide what to do in the callMe() method, pass it (as a boolean, int, etc.).

It will confuse other developers working on your code why callMe() has what are essentially secret parameters.

public void testOne(){
    callMe("testOne");
}

public void testTwo(){
    callMe("testTwo");
}

public void callMe(String methodName){
    System.out.println("I was called by following method."+methodName);     
}

Upvotes: 7

Related Questions