2010-12-03 23 views
1

Ist es möglich, zu wissen, welche Methode eine andere dynamisch aufrufen ?.Java Aufruf einer Methode

Siehe unten:

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

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

Warum Sie es brauchen? Wenn Sie das Methodenverhalten ändern, können Sie das nicht mithilfe von Variablen steuern, die Sie übergeben? – thejh

+0

Übrigens brauchen Sie 'this' nicht vor Methodenaufrufen zu setzen. –

Antwort

6

Nicht ohne Ausnahmen Hacken um und ziehen die stacktraces aus ihnen mit zu schaffen.

Ich würde fragen, warum Sie das tun möchten? In der Vergangenheit, als Leute das gefragt haben, war es fast immer ein Zeichen für ein schlechtes Design irgendwo.

0

Sie können einen Stacktrace erhalten:

new Throwable().getStackTrace() 

Es gibt ein Array aller Anrufer aus dem ersten.

0

Wenn Sie eine IDE wie Eclipse verwenden, können Sie einen Haltepunkt platzieren und sich den Aufruf-Stack ansehen. Quck Google-Suche auf Java-Call-Stack, aufgedreht 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); 
    } 
    } 
} 
+0

Thhhx !! =) ... du hast ein paar Ideen gegeben –

+0

whoa !? Was ist mit meinem Code passiert? - behoben – Casey

2

Oder Sie verwenden Thread.currentThread().getStackTrace()

+0

Das schafft intern noch einen Throwable und ist ziemlich teuer, aber es funktioniert zum größten Teil –