如何从该方法中获取方法名称?

时间:2011-04-05 18:44:09

标签: java android reflection

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

  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 个答案:

答案 0 :(得分:8)

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

如果你改变上面的return语句,你会得到立即调用方法名称,cource depth应该为零..

答案 1 :(得分:3)

尽管启动异常是一种更昂贵的方式,但无论如何我都会这样做。

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

如果在onCreate中调用,则工作。

答案 2 :(得分: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

答案 3 :(得分: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”。当然,您可能还需要为函数添加一些边界检查,因为它可以轻松地在数组之外。