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

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

4 голосов
/ 26 марта 2011
#include <stdio.h>
void someFunc(void) {
  printf("%s\n"), __func__);
}

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

someFunc

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

Я нашел

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

И

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

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

Ответы [ 5 ]

6 голосов
/ 26 марта 2011

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

2 голосов
/ 26 марта 2011

Ответ - нет.

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

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

2 голосов
/ 26 марта 2011

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

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

ВНИМАНИЕ! Создание местоположения вызывающего абонента. информация очень медленная и следует избегать, если исполнение скорость не проблема.

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

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

2 голосов
/ 26 марта 2011

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

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

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

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

0 голосов
/ 09 апреля 2019

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

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

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

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

...