在 Java 中,您可以通过使用 Reflection API 来获取当前正在执行的方法名。Reflection API 允许您在运行时查询和操作类的信息,包括它的字段、方法、构造函数等。

以下是一个简单示例,展示了如何使用 Reflection 来获取当前方法的名字:

import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) {
        try {
            // 获取当前正在执行的方法对象
            Method method = Method.getMethod("main", String[].class);
            
            // 获取方法名
            String methodName = method.getName();
            
            // 输出方法名
            System.out.println("当前方法名: " + methodName);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

在这个示例中,我们使用 Method.getMethod() 方法来获取当前 main 方法的对象。然后,我们通过调用 method.getName() 方法来获取方法名。

请注意,这个方法是在您知道要获取的方法名的情况下使用的。如果您想获取任何方法的名字,您需要使用其他更复杂的方法,你可以使用StackTraceElement类,这是通过Thread.currentThread().getStackTrace()方法返回的堆栈跟踪元素的数组。通常,数组中的第一个元素是获取堆栈跟踪的方法(即getStackTrace()方法本身),而第二个元素是你当前所在的方法。

以下是一个示例方法,展示了如何获取当前方法名:

javapublic class MethodNameExample {

    public static void main(String[] args) {
        printMethodName();
    }

    public static void printMethodName() {
        // 获取当前线程的堆栈跟踪元素
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();

        // 第二个元素是调用getStackTrace()的方法(通常是Thread类的某个方法)
        // 第三个元素才是我们当前所在的方法
        if (stackTraceElements.length > 2) {
            // 获取当前方法名(不包括类名和参数)
            String methodName = stackTraceElements[2].getMethodName();
            System.out.println("当前方法名是:" + methodName);
        } else {
            System.out.println("堆栈跟踪元素不足以获取方法名");
        }
    }
}
public class MethodNameExample {

    public static void main(String[] args) {
        printMethodName();
    }

    public static void printMethodName() {
        // 获取当前线程的堆栈跟踪元素
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();

        // 第二个元素是调用getStackTrace()的方法(通常是Thread类的某个方法)
        // 第三个元素才是我们当前所在的方法
        if (stackTraceElements.length > 2) {
            // 获取当前方法名(不包括类名和参数)
            String methodName = stackTraceElements[2].getMethodName();
            System.out.println("当前方法名是:" + methodName);
        } else {
            System.out.println("堆栈跟踪元素不足以获取方法名");
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.

注意:

  1. 数组索引是从0开始的,所以stackTraceElements[0]getStackTrace()方法的调用,stackTraceElements[1]是调用getStackTrace()的方法(在上面的例子中,是printMethodName方法),而stackTraceElements[2]是你实际关心的调用printMethodName的方法(在这种情况下,它是main方法,但在其他情况下,它可能是其他方法)。但是,由于我们直接在printMethodName中调用以获取其名称,所以我们通常关注stackTraceElements[2]
  2. 为了防止数组索引越界,我们在访问stackTraceElements[2]之前检查数组长度是否大于2。
  3. 这种方法虽然可行,但在生产代码中频繁使用可能会对性能产生影响,因为它涉及到堆栈跟踪的生成,这是一个相对昂贵的操作。如果可能的话,最好寻找其他解决方案或优化方法。