有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java获取方法调用方的方法名

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

这可能吗

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

共 (5) 个答案

  1. # 1 楼答案

    您可以使用以下选项:

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

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

    Some virtual machines may, under some circumstances, omit one or more stack frames from the stack trace. In the extreme case, a virtual machine that has no stack trace information concerning this thread is permitted to return a zero-length array from this method.

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

  2. # 2 楼答案

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

    使用此选项,您可以获得当前方法名称:

    String method_name = Thread.currentThread().getStackTrace()[1].getMethodName());
    
  4. # 4 楼答案

    可以在当前线程上使用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()); 
    
            }
    
  5. # 5 楼答案

    此方法按调用顺序显示方法调用层次结构的3个最近点,同时忽略包括以下方法本身的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;
    }