Java 获取我的方法的方法名称';来电者

Java 获取我的方法的方法名称';来电者,java,android,Java,Android,我有两种方法。其中一个,我称之为第二个。在第二个方法中,我需要知道调用这个(第二个)方法的方法的名称 这可能吗 public class Test { public void foo() { String m = getCallingMethodName(); } public String getCallingMethodName() { return callerMethodName; //should return "foo" } } 您可以使用以下选项:

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

这可能吗

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

您可以使用以下选项:

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
StackTraceElement stackTraceElement = stackTraceElements[1];
String methodName = stackTraceElement.getMethodName();
但是,根据
Thread#getStackTrace()
的Javadocs,这不能保证返回准确的结果:

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


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

这样您就可以获得当前的方法名称:

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

这里的其他答案都是正确的,但我想我需要补充一点注意事项。如果您使用反射调用东西,这将不起作用,而且如果您有任何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());
    }
}

可以在当前线程上使用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()); 

        }
stackTraceeElement[]stackTraceeElements=Thread.currentThread().getStackTrace();

对于(int i=1;i
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;
}

虽然您可以使用manouti提供的代码来完成,但如果由于内联之类的原因而失败,我也不会感到完全惊讶——最好尽可能避免使用内联。您想实现什么?是的。您可以获取当前线程的堆栈跟踪,并从顶部向下查看下一个线程。(当我接触到一台真正的计算机时,我可以提供更多的细节,而不是通过手机进行响应,或者其他人可以随意将其转化为答案)。不过,我建议将您的代码更改为不需要,因为这会使您的代码变得脆弱。为什么打电话的人不将此信息作为参数传递?好的,我正在使用Android(Xposed)模块。我需要知道谁调用了Android API X。我指的是谁的应用程序(包)和确切的方法/类。希望我不必做这么大的改动,但还不知道如何简化它。