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();
}
Таким образом, вы можете не только найти имя метода, но и другие интересные функции метода, такие как аннотации, параметризованные типы и т. Д.
Я хотел бы, чтобы был более встроенный способ получения метаданных во время выполнения...