要取得当前运行代码的函数名,可以用:
Thread.currentThread().getStackTrace()[1].getMethodName();
但是,这行代码有些过长,嵌入业务代码稍显突兀,这时可以采用下面的共通函数:
public static String digoutMethodName() { return Thread.currentThread().getStackTrace()[2].getMethodName(); }
从上面代码可以看出,其本质是取当前线程的调用栈,栈的第一个元素是getStackTrace自己,第二个是digoutMethodName,第三个就是调用digoutMethodName的外界函数了。如果调用层次越深,调用栈越长,最终会到main函数处。
以下为完整程序:
package com.ufo.func; public class Tester { public static void main(String[] args) { foo(); bar(); } public static void foo() { System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName()); } private static int bar() { System.out.println(digoutMethodName()); System.out.println("----------------------"); printStackMethods(); return 0; } public static String digoutMethodName() { return Thread.currentThread().getStackTrace()[2].getMethodName(); } private static void printStackMethods() { for(StackTraceElement ste:Thread.currentThread().getStackTrace()) { System.out.println(ste.getMethodName()); } } }
输出:
foo bar ---------------------- getStackTrace printStackMethods bar main
2020年1月19日