获取当前正在执行的方法的名称。

获取当前正在执行的方法的名称。

有办法在Java中获取当前正在执行的方法的名称吗?



30秒到达战场
浏览 1080回答 3
3回答

墨色风雨

Thread.currentThread().getStackTrace()通常包含调用它的方法,但也有一些缺陷(请参阅Javadoc):在某些情况下,某些虚拟机可能从堆栈跟踪中省略一个或多个堆栈帧。在极端情况下,如果虚拟机没有有关此线程的堆栈跟踪信息,则允许该方法返回一个零长度数组。

慕妹3146593

从技术上讲这是可行的.。String name = new Object(){}.getClass().getEnclosingMethod().getName();但是,在编译期间将创建一个新的匿名内部类(例如,YourClass$1.class)。因此,这将创建一个.class用于部署此技巧的每个方法的文件。此外,在运行时,每次调用都会创建一个未使用的对象实例。因此,这可能是一个可以接受的调试技巧,但它确实会带来很大的开销。这个把戏的好处是getEncosingMethod()回报java.lang.reflect.Method可用于检索方法的所有其他信息,包括注释和参数名称。这使得区分具有相同名称的特定方法(方法重载)成为可能。注意,根据getEnclosingMethod()这个技巧不应该抛出SecurityException应该使用相同的类加载器加载内部类。因此,即使存在安全管理器,也不需要检查访问条件。它需要使用getEnclosingConstructor()建筑工人。在(命名)方法之外的块期间,getEnclosingMethod()回报null.

达令说

完整的代码将:/** &nbsp;*&nbsp;Get&nbsp;the&nbsp;method&nbsp;name&nbsp;for&nbsp;a&nbsp;depth&nbsp;in&nbsp;call&nbsp;stack.&nbsp;<br&nbsp;/> &nbsp;*&nbsp;Utility&nbsp;function &nbsp;*&nbsp;@param&nbsp;depth&nbsp;depth&nbsp;in&nbsp;the&nbsp;call&nbsp;stack&nbsp;(0&nbsp;means&nbsp;current&nbsp;method,&nbsp;1&nbsp;means&nbsp;call&nbsp;method,&nbsp;...) &nbsp;*&nbsp;@return&nbsp;method&nbsp;name &nbsp;*/public&nbsp;static&nbsp;String&nbsp;getMethodName(final&nbsp;int&nbsp;depth){ &nbsp;&nbsp;final&nbsp;StackTraceElement[]&nbsp;ste&nbsp;=&nbsp;Thread.currentThread().getStackTrace(); &nbsp;&nbsp;//System.&nbsp;out.println(ste[ste.length-depth].getClassName()+"#"+ste[ste.length-depth].getMethodName()); &nbsp;&nbsp;//&nbsp;return&nbsp;ste[ste.length&nbsp;-&nbsp;depth].getMethodName();&nbsp;&nbsp;//Wrong,&nbsp;fails&nbsp;for&nbsp;depth&nbsp;=&nbsp;0 &nbsp;&nbsp;return&nbsp;ste[ste.length&nbsp;-&nbsp;1&nbsp;-&nbsp;depth].getMethodName();&nbsp;//Thank&nbsp;you&nbsp;Tom&nbsp;Tresansky}更多这个问题.青色评论:我使用JRE 6并给出了不正确的方法名。如果我写ste[2 + depth].getMethodName().0是getStackTrace(),1是getMethodName(int depth)和2正在调用方法。为了取回方法名,需要计算要应用的正确索引。
打开App,查看更多内容
随时随地看视频慕课网APP