Java调用方法

时间:2010-12-03 22:26:28

标签: java

有可能知道哪个方法动态调用另一个方法吗?

见下文:

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

       public void two(){
          this.one();
       }
 }

4 个答案:

答案 0 :(得分:6)

不是没有通过创建异常并将堆栈跟踪从它们中拉出来。

我会问你为什么要这样做?在过去人们问过这个问题时,几乎总是某个地方设计糟糕的迹象。

答案 1 :(得分:2)

或者您可以使用Thread.currentThread().getStackTrace()

答案 2 :(得分:0)

你可以获得一个堆栈跟踪:

new Throwable().getStackTrace()

它返回第一个调用者的数组。

答案 3 :(得分:0)

如果您使用的是Eclipse等IDE,则可以放置一个断点并查看调用堆栈。 Quck google搜索java调用堆栈,调高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);
     }
  }
}