Java中获取当前函数名

有时候我们需要在程序中获取当前运行的函数名,如何简单的做到这点呢?我们可以用getStackTrace轻松搞定。


一提到getStatckTrace多数人会联想到Thowable中的getStackTrace方法。的确,也正是发现StackTraceElement中有getMethod方法,使我找到了此问题的突破口。


在Java JDK 5中,有三个类拥有getStackTrace方法,分别是ThreadInfo, Thread和Throwable。此处,我们用Thread.currentThread()中的StackTraceElement来获取当前函数名。具体代码如下:

 

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]; 

 

原来是getStackTrace里面又调用了dumpThreads方法, 又因为dumpThreads是个native方法。因此,把dumpThreads作为了StackTrace中第一个element。


所以,只要用的是jdk1.5,那么放心的用[2]吧,不会出问题的


Hope it can relax your eyes : )

 bi

你可能感兴趣的:(java,jdk,thread,idea)