为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

30秒到达战场 2019-06-20 16:30:59
获取当前正在执行的方法的名称。有办法在Java中获取当前正在执行的方法的名称吗?
查看完整描述

3 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

Thread.currentThread().getStackTrace()通常包含调用它的方法,但也有一些缺陷(请参阅Javadoc):

在某些情况下,某些虚拟机可能从堆栈跟踪中省略一个或多个堆栈帧。在极端情况下,如果虚拟机没有有关此线程的堆栈跟踪信息,则允许该方法返回一个零长度数组。


查看完整回答
反对 回复 2019-06-20
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

从技术上讲这是可行的.。

String name = new Object(){}.getClass().getEnclosingMethod().getName();

但是,在编译期间将创建一个新的匿名内部类(例如,YourClass$1.class)。因此,这将创建一个.class用于部署此技巧的每个方法的文件。此外,在运行时,每次调用都会创建一个未使用的对象实例。因此,这可能是一个可以接受的调试技巧,但它确实会带来很大的开销。

这个把戏的好处是getEncosingMethod()回报java.lang.reflect.Method可用于检索方法的所有其他信息,包括注释和参数名称。这使得区分具有相同名称的特定方法(方法重载)成为可能。

注意,根据getEnclosingMethod()这个技巧不应该抛出SecurityException应该使用相同的类加载器加载内部类。因此,即使存在安全管理器,也不需要检查访问条件。

它需要使用getEnclosingConstructor()建筑工人。在(命名)方法之外的块期间,getEnclosingMethod()回报null.


查看完整回答
反对 回复 2019-06-20
?
达令说

TA贡献1821条经验 获得超6个赞

完整的代码将

/**
 * Get the method name for a depth in call stack. <br />
 * Utility function
 * @param depth depth in the call stack (0 means current method, 1 means call method, ...)
 * @return method name
 */public static String getMethodName(final int depth){
  final StackTraceElement[] ste = Thread.currentThread().getStackTrace();

  //System. out.println(ste[ste.length-depth].getClassName()+"#"+ste[ste.length-depth].getMethodName());
  // return ste[ste.length - depth].getMethodName();  //Wrong, fails for depth = 0
  return ste[ste.length - 1 - depth].getMethodName(); //Thank you Tom Tresansky}

更多这个问题.


青色评论:

我使用JRE 6并给出了不正确的方法名。
如果我写ste[2 + depth].getMethodName().

  • 0

    getStackTrace(),

  • 1

    getMethodName(int depth)

  • 2

    正在调用方法。

为了取回方法名,需要计算要应用的正确索引。


查看完整回答
反对 回复 2019-06-20
  • 3 回答
  • 0 关注
  • 1079 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信