获取方法调用者的方法名称

时间:2015-04-08 16:14:27

标签: java android

我有两种方法。在其中一个中,我称之为第二个。在第二个中,我需要知道方法的名称,该方法称之为(第二个)。

这甚至可能吗?

public class Test {
  public void foo() {
    String m = getCallingMethodName();
  }
  public String getCallingMethodName() {
    return callerMethodName; //should return "foo"
  }
}

5 个答案:

答案 0 :(得分:1)

通过这个,你可以获得当前的方法名称:

String method_name = Thread.currentThread().getStackTrace()[1].getMethodName());

答案 1 :(得分:1)

这里的其他答案都是正确的,但我想我会添加一点注意事项。如果使用反射调用内容,这将无效,如果您有任何AOP连接点/代理等,它也可能无法获得正确的堆栈帧。

例如......

import java.lang.reflect.Method;

public class CallerInfoFinder {

    public static void main(String[] args) throws Exception {
        otherMethod(); // Prints "main"

        Method m = CallerInfoFinder.class.getDeclaredMethod("otherMethod");

        m.invoke(null); // Prints "invoke0"
    }

    private static void otherMethod() {
        System.out.println(new Exception().getStackTrace()[1].getMethodName());
    }
}

答案 2 :(得分:0)

您可以使用以下内容:

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
StackTraceElement stackTraceElement = stackTraceElements[1];
String methodName = stackTraceElement.getMethodName();

但是,根据Thread#getStackTrace()的Javadocs,无法保证返回准确的结果:

  

在某些情况下,某些虚拟机可能会从堆栈跟踪中省略一个或多个堆栈帧。在极端情况下,允许没有关于此线程的堆栈跟踪信息的虚拟机从此方法返回零长度数组。

如果想要在所有JVM实现上获得准确的结果,您可能应该重新考虑您的程序设计。

答案 3 :(得分:0)

您可以在当前线程上使用getStackTrace()方法。这将以相反的顺序返回调用堆栈

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
        for (int i = 1; i < stackTraceElements.length && i<=4; i++) {
            StackTraceElement stackTraceElement = stackTraceElements[i];
            System.out.println(stackTraceElement.getClassName() + " Method "
            + stackTraceElement.getMethodName()); 

        }

答案 4 :(得分:0)

此方法按照调用它们的顺序显示3个最近的Method调用层次点,同时忽略包含以下方法本身的2个最新方法。这对于在多个路径访问同一位置的程序单元中捕获方法层次结构非常有用。

private static String getRecentSteps() {
    String recentSteps = "";
    StackTraceElement[] traceElements = Thread.currentThread().getStackTrace();
    final int maxStepCount = 3;
    final int skipCount = 2;

    for (int i = Math.min(maxStepCount + skipCount, traceElements.length) - 1; i >= skipCount; i--) {
        String className = traceElements[i].getClassName().substring(traceElements[i].getClassName().lastIndexOf(".") + 1);
        recentSteps += " >> " + className + "." + traceElements[i].getMethodName() + "()";
    }

    return recentSteps;
}