Ленивый анализ стека с помощью StackWalker
Анализируйте кадры стека лениво с помощью StackWalker вместо создания полной трассировки стека.
Сравнение кода
✕ Materialized stack trace
StackTraceElement caller = Thread.currentThread()
.getStackTrace()[2];
String callerClass = caller.getClassName();
✓ Java 9+
String callerClass = StackWalker.getInstance()
.walk(frames -> frames.skip(1)
.findFirst()
.orElseThrow()
.getClassName());
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Ленивый обход
Посещает только те кадры, которые нужны операции.
Удобная работа с потоками
Для фильтрации и выбора используются стандартные операции Stream API.
Настраиваемость
Параметры обеспечивают доступ к ссылкам на классы, скрытым и рефлексивным кадрам.
Старый подход
Thread.getStackTrace()
Современный подход
StackWalker
Начиная с JDK
9
Сложность
Средний
Поддержка JDK
Ленивый анализ стека с помощью StackWalker
Доступно
Широко доступно начиная с JDK 9 (сентябрь 2017)
Как это работает
StackWalker предоставляет ленивый поток кадров стека и настраиваемый доступ к сохранённым ссылкам на классы. Код может остановиться сразу после нахождения нужного кадра, не выделяя память под весь массив трассировки стека.
Связанная документация
Доказательство