Java эквивалентно __func__

#include <stdio.h>
void someFunc(void) {
  printf("%s\n"), __func__);
}

Каждый раз, когда вызывается функция, она напечатает:

someFunc

Что такое эквивалент Java?

я нашел

(new Exception()).getStackTrace()[0].getMethodName()

А также

java.lang.Thread.currentThread().getStackTrace()[1].getMethodName()

Но это просто смешно, есть ли более простой способ?

4 ответа

Решение

Нет, проще нет. Поскольку в Java нет макроса, нет ничего, что прямо эквивалентно версии C++.

Ответ - нет.

Кстати, два подхода, которые вы нашли, по сути эквивалентны. Если t это текущий поток, то t.getStackTrace() работает, создавая экземпляр Exception и звонит getStaceTrace() в теме.

Как уже отмечалось, создание Exception захват трассировки стека является дорогостоящей операцией в Java, поэтому вы должны делать это с осторожностью.

С небольшой настройкой вы можете настроить что-то вроде log4j с шаблоном, который включает имя метода (и любые другие детали, которые вы хотите), тогда все, что вам нужно сделать, это что-то вроде:

private static final Logger log = Logger.getLogger(MyClass.class);

void someMethod() {
    log.info("text");
}

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

Вы можете использовать log4j и использовать шаблон%M для вывода имени метода, когда это необходимо -> http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

В документации, однако, есть это предупреждение:

ПРЕДУПРЕЖДЕНИЕ Генерация информации о местоположении вызывающего абонента является чрезвычайно медленной и ее следует избегать, если только скорость выполнения не является проблемой.

Они, вероятно, используют трюк, похожий на ваш (new Exception()).getStackTrace()[0].getMethodName(), но это очень медленный вызов для использования в каждом операторе журнала.

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

Еще один нелепый способ получения java.lang.reflect.Method метода включения будет:

void someMethod() {
    class A{}
    Method thisMethod = A.class.getEnclosingMethod();
}

Таким образом, вы можете не только найти имя метода, но и другие интересные функции метода, такие как аннотации, параметризованные типы и т. Д.

Я хотел бы, чтобы был более встроенный способ получения метаданных во время выполнения...

Другие вопросы по тегам