Как узнать имя вызывающего метода через рефлексию в Java

206
12 ноября 2021, 04:40

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

// объект нужного класса
Class<?> c = new Object() { }.getClass().getEnclosingClass();
// полное имя класса
String nameFullleClass = c.getName();
// массив с именами всех методов
Method[] methods = c.getDeclaredMethods();

Вопрос: как обработать массив, чтобы увидеть имя именно вызывающей функции? Или есть какой-то еще способ? Спасибо!

Answer 1

Рефлексия для этого не предназначена. Это можно сделать с помощью StackWalker.

System.out.println(StackWalker
        .getInstance()
        .walk(
                stackFrameStream -> stackFrameStream.map(
                        stackFrame -> stackFrame.getClassName() + " / " + stackFrame.getMethodName()
                ).skip(1).limit(1).collect(Collectors.toList())
        ).get(0));

Либо, как предложил Stranger in the Q, через Exception.

StackTraceElement sTE = new Exception().getStackTrace()[1];
System.out.println(sTE.getClassName() + " / " + sTE.getMethodName());

Это, конечно, намного проще.

READ ALSO
Не делается дамп памяти Java, хотя все указано правильно

Не делается дамп памяти Java, хотя все указано правильно

У меня случается утечка памяти и сервер падает с Out of Memory Error

117
Как поменять настройки Hikari Connection Pool

Как поменять настройки Hikari Connection Pool

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

290
Создание объекта без ключевого слова new

Создание объекта без ключевого слова new

Если в Java для выделения памяти под новый объект используют ключевое слово new, то почему в данной ситуации, при создании экземпляра класса...

140
lambda expressions

lambda expressions

недавно изучаю лямбды

176