如何在方法内部获取方法名?

6

我正在尝试创建一个函数,该函数从其中的方法返回方法名称:

  public static String getMethodName(final int depth)
  {
    final StackTraceElement[] ste = Thread.currentThread().getStackTrace();
    return ste[ste.length - 1 - depth].getMethodName();
  }

然而,当我从Activity.onCreate()方法中调用该方法时,它返回的是"main"而不是"onCreate"。

如何在该方法内获取实际的方法名称?

4个回答

8
return ste[1+depth].getMethodName();

如果您将返回语句更改为上述内容,您将立即获得调用方法的名称,当然深度应该为零。

我尝试了您建议的更改,现在它返回“getStackTrace”。当然,我正在使用getMethodName(0)进行调用。 - Android Eve
4
@Android Eve,ste[0] --> getStackTrace,ste[1] --> getMethodName,ste[2] --> getMethodName的直接调用者... (翻译解释:这是一段代码注释,介绍了一些Java堆栈跟踪的相关内容。其中,“ste”代表“堆栈跟踪元素”,“getStackTrace”方法可用于返回一个包含当前线程的堆栈跟踪信息的数组。"ste[0]"表示该数组中的第一个元素,即最后一个执行的方法;"ste[1]"表示倒数第二个执行的方法,而"ste[2]"则表示调用"ste[1]"的方法。) - Gursel Koca
我建议修改原始解决方案以匹配评论中提出的答案。 - AshesToAshes

3

尽管引发异常的方式更加耗费资源,但我仍然会这样做。

Log.d("CurrentMethod", new Exception().getStackTrace()[0].getMethodName());

如果在onCreate中调用,就可以正常工作。


1
我不明白 - 为什么要创建一个异常而不是调用 Thread.currentThread().getStackTrace() - Duncan Jones

2

一个用于管理日志的单例:

public class ActiveLog {
public static final String TAG = "TRACE LOG";
private static ActiveLog instance;
private static boolean actif;

public static ActiveLog getInstance() {
    if (null == instance) 
        instance = new ActiveLog();
    return instance;
}

private ActiveLog() {
    ActiveLog.setActif(true);
}

public void log() {
    if(isActif())
        Log.d(TAG, "" + (new Exception().getStackTrace()[1].getClassName())
                      + ": "
                      + (new Exception().getStackTrace()[1].getMethodName()));
}

public static boolean isActif() {
    return actif;
}

public static void setActif(boolean actif) {
    ActiveLog.actif = actif;
}}

一个使用示例:

public class MyTest {
  public void test() {
    ActiveLog.getInstance().log();
  }
}

结果如下:
09-05 14:37:09.822: D/TRACE LOG(XXXX): com.TestProject.MyTest: test

1

我认为你的问题可能是你在倒序访问堆栈。在返回值元素中,0是最近的调用(也就是getStackTrace())。我想你打算做的是:

public static String getMethodName(final int depth) {
  final StackTraceElement[] ste = Thread.currentThread().getStackTrace();
  return ste[1 + depth].getMethodName();
}

这将访问堆栈中最近的调用(除了调用getStackTrace()之外)。例如,如果您有一个方法:

public void foo() {
  System.out.println(getMethodName(0));
}

使用上述函数实现,将打印出“foo”。当然,您可能还想向该函数添加一些边界检查,因为它很容易超出数组范围。


我尝试了您建议的更改,现在它返回“getStackTrace”。当然,我正在使用getMethodName(0)进行调用。 - Android Eve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接