Java中获取当前函数名
- 博客分类:
- Java
有时候我们需要在程序中获取当前运行的函数名,如何简单的做到这点呢?我们可以用getStackTrace轻松搞定。
一提到getStatckTrace多数人会联想到Thowable中的getStackTrace方法。的确,也正是发现StackTraceElement中有getMethod方法,使我找到了此问题的突破口。
在Java JDK 5中,有三个类拥有getStackTrace方法,分别是ThreadInfo, Thread和Throwable。此处,我们用Thread.currentThread()中的StackTraceElement来获取当前函数名。具体代码如下:
- Thread.currentThread().getStackTrace()[2].getMethodName();
Thread.currentThread().getStackTrace()[2].getMethodName();
有人会问,为啥是2呢?如何肯定返回的StackTraceElement数组中第二个元素即是当前运行的函数。
首先,我们看下jdk里是如何解释Thread.getStackTrace方法的。
Returns an array of stack trace elements representing the stack dump of this thread.This method will return a zero-length array if this thread has not started or has terminated.
也就是执行过的程序都会以stack dump的形式展现。根据dubug数据我们推断, 它的顺序应该是:
0->dumpThreads
1->getStackTrace
2->Current
...
...
n->main(主线程)/ 某线程起始的方法
getStackTrace的存在不难理解,因为实际上我们调用的就是getStackTrace方法,那么dumpThreads从何而来呢?
查了java源代码,原来在Thread的getStackTrace方法中,有这样一句
- return dumpThreads(new Thread[] {this})[0];
return dumpThreads(new Thread[] {this})[0];
原来是getStackTrace里面又调用了dumpThreads方法, 又因为dumpThreads是个native方法。因此,把dumpThreads作为了StackTrace中第一个element。
所以,只要用的是jdk1.5,那么放心的用[2]吧,不会出问题的