java问题决定谁调用了这个方法

时间:2011-07-21 18:44:20

标签: java

我有以下场景     testOne()和testTwo都调用相同的callMe()方法。

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.

4 个答案:

答案 0 :(得分: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);     
}

答案 1 :(得分: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);
}

答案 2 :(得分:1)

抱歉,我的意思是回答你的问题而不是评论:(所以这里是

我认为这个已经回答的问题可以帮到你:Get current stack trace in Java

答案 3 :(得分: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);
}