Почему выборка результатов с использованием «new Throwable (). GetStackTrace () [1] .getMethodName ()» считается дорогой? - PullRequest
1 голос
/ 09 января 2020

Я использую

new Throwable().getStackTrace()[1].getMethodName()

Некоторые разработчики называют его дорогим. Чем этот метод дорог? Должны ли мы использовать его, и если да, то какое предостережение следует предпринять?

В моем случае очень важно найти имя вызывающего метода.

Существует около 50 рабочих мест, поэтому это будет исполняется около 100 раз на 32 ГБ ОЗУ в автономной программе на Java8.

1 Ответ

2 голосов
/ 09 января 2020

Вы можете получить имя метода статически без создания дополнительного Throwable объекта

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

Спасибо за @ RiteshPuj

Уведомление getStackTrace внутри все еще создайте объект (Exception или Thread[])

   StackTraceElement[][] stackTraceArray = dumpThreads(new Thread[] {this});
...
} else {
   // Don't need JVM help for current thread
   return (new Exception()).getStackTrace();

Для Java 9+ используйте StackWalker (Спасибо за @StuartMarks)

public void methodB(){
        System.out.println("I am methodB");
        StackWalker.getInstance()
                   .walk(frames -> frames.skip(1).findFirst())
                   .ifPresent(frame -> {
                        System.out.println("I was called by a method named: " + frame.getMethodName());
                   });
    }
...