Как я могу получить имя метода из этого метода? - PullRequest
6 голосов
/ 05 апреля 2011

Я пытаюсь создать функцию, которая возвращает имя метода из этого метода:

  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 голосов
/ 05 апреля 2011
return ste[1+depth].getMethodName();

Если вы измените оператор возврата, как указано выше, вы получите немедленное имя вызывающего метода, глубина которого должна быть равна нулю.

3 голосов
/ 05 апреля 2011

Несмотря на то, что инициирование исключения является более дорогим способом, я бы все равно это сделал.

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

Работает, если вызывается в onCreate.

2 голосов
/ 05 сентября 2012

Синглтон для управления журналами:

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 голос
/ 05 апреля 2011

Я думаю, что ваша проблема в том, что вы получаете доступ к стеку вверх ногами.В возвращаемом значении элемент 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» с вышеприведенной реализацией функции.Конечно, вы можете также захотеть добавить некоторые проверки границ в функцию, так как она может легко выйти за пределы массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...