Получение имени текущего выполняемого метода

От: microsoft docs :

вы можете выбрать любой файл файла App.config.

438
задан Kedar Mhaswade 30 July 2017 в 12:08
поделиться

3 ответа

Thread.currentThread().getStackTrace() будет обычно содержать метод you’re вызов его от, но существуют ловушки (см. Javadoc):

Некоторые виртуальные машины, при некоторых обстоятельствах, могут опустить один или несколько стековых фреймов от отслеживания стека. В крайнем случае виртуальной машине, которая не имеет никакой информации трассировки стека относительно этого потока, разрешают возвратить массив нулевой длины из этого метода.

168
ответ дан RAnders00 30 July 2017 в 12:08
поделиться
  • 1
    Ничего себе, я не могу в полной мере отблагодарить Вас. Это было точно, что мне были нужны все в одном месте. – Douglas.Sesar 23 May 2014 в 08:11

Январь 2009:
А полный код был бы (для использования с протест @Bombe в памяти):

/**
 * 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
}
[еще 1119] в этот вопрос .

декабрь 2011 Обновления:

синеватый комментарии:

я использую JRE 6, и дает мне неправильное имя метода.
Это работает, если я пишу ste[2 + depth].getMethodName().

  • 0, getStackTrace(),
  • 1 getMethodName(int depth), и
  • 2 вызывает метод.

ответ virgo47 (upvoted) на самом деле вычисляет правильный индекс для применения для возвращения имени метода.

134
ответ дан Community 30 July 2017 в 12:08
поделиться

Я переписанный немного ответ maklemenz :

private static Method m;

static {
    try {
        m = Throwable.class.getDeclaredMethod(
            "getStackTraceElement",
            int.class
        );
    }
    catch (final NoSuchMethodException e) {
        throw new NoSuchMethodUncheckedException(e);
    }
    catch (final SecurityException e) {
        throw new SecurityUncheckedException(e);
    }
}


public static String getMethodName(int depth) {
    StackTraceElement element;

    final boolean accessible = m.isAccessible();
    m.setAccessible(true);

    try {
        element = (StackTraceElement) m.invoke(new Throwable(), 1 + depth);
    }
    catch (final IllegalAccessException e) {
        throw new IllegalAccessUncheckedException(e);
    }
    catch (final InvocationTargetException e) {
        throw new InvocationTargetUncheckedException(e);
    }
    finally {
        m.setAccessible(accessible);
    }

    return element.getMethodName();
}

public static String getMethodName() {
    return getMethodName(1);
}

0
ответ дан 22 November 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: