我有以下场景 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.
答案 0 :(得分:7)
任何让你生成堆栈跟踪并查看第二帧的解决方案都会导致痛苦 - 你实际上正在做的是绕过将函数需要传递给它的想法,以便函数能够做它的工作。
如果您需要调用方法的名称,那么只需将其作为参数传递。如果您需要其他一些数据来决定在callMe()
方法中执行哪些操作,请将其传递(作为boolean
,int
等)。
它会使处理代码的其他开发人员感到困惑,为什么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);
}