2011-07-21 8 views
0

私は の両方のtestOne()とtestTwoが同じcallMe()メソッドを呼び出すという以下のシナリオを持っています。Javaの質問このメソッドを呼び出した人を決定する

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. 
+6

これを把握しようとしていますか?デバッガの場合は、コールスタックを見てください。何らかのプログラム設計の理由でこれをやろうとしているのであれば、その理由を教えてください。 – Marvo

答えて

7

あなたはスタックトレースを生成し、第二のフレームを見ていたすべてのソリューションは、痛みにつながるとしているものです - あなたが、本質的にやっていることは順番にそれに機能が必要なものを渡すのアイデアをバイパスされますそれが仕事をするための機能のために。

呼び出し元メソッドの名前が必要な場合は、をパラメーターとして渡すだけです。 callMe()メソッドで何をすべきかを決めるために他のデータが必要な場合は、それを(booleanintなどのように)渡します。

あなたのコードに取り組んでいる他の開発者は、なぜcallMe()に本質的に秘密のパラメータがあるのか​​混乱します。

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);  
} 
+0

なぜ私はそれについて考えなかったのか分かりません。ありがとう... – user234194

+0

これは間違いなく最高の答えですが、スタックトレースコードを書くのは面白かったです。 – Kainsin

1

申し訳ありませんが、私はあなたの質問に答えると、それは

であるので、ここで:(コメントしないことを意味し、私はこのすでに答え質問はあなたを助けるかもしれないと思う:Get current stack trace in Java

1

最も簡単な方法は、使用することですパラメータは

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);  
} 

ただし、コールスタックを使用することができます。

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

なぜ '[2]'ですか?最初の要素( '[0]')は 'callMe'メソッドです。呼び出し元が3番目の要素ではなく2番目の要素になるのではないでしょうか? –

+1

いいえ、最初の要素は 'Thread.java'から' getStackTrace'メソッドを保持します。 – Kainsin

+0

最初の要素 '[0]'のメソッド名は、スタックトレースを取得するために呼び出す必要があるため、 'getStackTrace'です。 :) 2番目の名前 '[1]'は 'callMe'、3番目の' [2] 'は呼び出し先です。 –

2

私の最高の答えは、スタックトレースを照会することです。

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); 
} 
+0

これが私を笑わせてくれたので+1しました:D これを書いて敬意を表します – dominicbri7

関連する問題