1

Is it possible how to know which method call another dynamically?.

See below:

class a {
       public void one(){
          System.out.println(methodWhoCallsVoidOne().getName());
        }

       public void two(){
          this.one();
       }
 }
2
  • Why do you need it? If it changes the methods behaviour, can't you control that using variables that you pass to it? Commented Dec 3, 2010 at 22:32
  • By the way, you don't need to put this in front of method invocations. Commented Dec 4, 2010 at 4:25

4 Answers 4

6

Not without hacking around with creating exceptions and pulling the stacktraces out of them.

I would question why you want to do this? In the past when people have asked this it has almost always been a sign of a bad design somewhere.

Sign up to request clarification or add additional context in comments.

Comments

2

Or you can use Thread.currentThread().getStackTrace()

1 Comment

That still creates a throwable internally and is rather expensive, but it does work for the most part
0

You can get a stacktrace:

new Throwable().getStackTrace()

It returns an array of all callers from the first one.

Comments

0

If you are using an IDE such as Eclipse, you could place a break point and look at the call stack. Quck google search on java call stack, turned up this:

public class WhoCalledMe {
 public static void main(String[] args) {
  f();
 }

 public static void f() {
     g();
 }

 public static void g() {
     showCallStack();
     System.out.println();
     System.out.println("g() was called by "+whoCalledMe());
 }

 public static String whoCalledMe() {
     StackTraceElement[] stackTraceElements =
     Thread.currentThread().getStackTrace();
     StackTraceElement caller = stackTraceElements[4];
     String classname = caller.getClassName();
     String methodName = caller.getMethodName();
     int lineNumber = caller.getLineNumber();
     return classname+"."+methodName+":"+lineNumber;
 }

 public static void showCallStack() {
     StackTraceElement[] stackTraceElements =
     Thread.currentThread().getStackTrace();
     for (int i=2 ; i<stackTraceElements.length; i++) {
          StackTraceElement ste = stackTraceElements[i];
          String classname = ste.getClassName();
          String methodName = ste.getMethodName();
          int lineNumber = ste.getLineNumber();
          System.out.println(classname+"."+methodName+":"+lineNumber);
     }
  }
}

1 Comment

Thhhx!! =)... you gave a pair of ideas

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.