Spec-Zone.ru › OpenJDK 25

Класс StackWalker

java.lang.Object
java.lang.StackWalker
public final class StackWalker extends Object
Обходчик стека.

Метод walk открывает последовательный поток StackFrame для текущего потока, а затем применяет заданную функцию для обхода потока StackFrame. Поток возвращает элементы кадров стека по порядку — от самого верхнего кадра, представляющего точку выполнения, в которой был сформирован стек, до самого нижнего кадра. Поток StackFrame закрывается при возврате из метода walk. При попытке повторно использовать закрытый поток будет выброшено исключение IllegalStateException.

Параметры обходчика стека настраивают сведения о кадрах стека, получаемые с помощью StackWalker. По умолчанию собираются имя класса и сведения о методе, но не Class reference. Сведения о методе можно исключить с помощью параметра DROP_METHOD_INFO. Объект Class можно сохранить для доступа с помощью параметра RETAIN_CLASS_REFERENCE. Кадры стека API отражения и классов реализации по умолчанию скрыты.

StackWalker является потокобезопасным. Несколько потоков могут совместно использовать один объект StackWalker для обхода собственного стека.

Примечание API:
Примеры

1. Поиск первого вызывающего метода с исключением известного списка классов реализации:

    StackWalker walker = StackWalker.getInstance(Set.of(Option.DROP_METHOD_INFO, Option.RETAIN_CLASS_REFERENCE));
    Optional<Class<?>> callerClass = walker.walk(s ->
            s.map(StackFrame::getDeclaringClass)
             .filter(Predicate.not(implClasses::contains))
             .findFirst());

2. Создание снимка 10 верхних кадров стека текущего потока:

    List<StackFrame> stack = StackWalker.getInstance().walk(s -> s.limit(10).toList());
Если не указано иное, передача аргумента null конструктору или методу этого класса StackWalker приведет к выбрасыванию исключения NullPointerException.
Начиная с версии:
9

Краткое описание вложенных классов

Модификатор и тип Класс Описание
static enum  StackWalker.Option
Параметр обходчика стека для настройки сведений о кадре стека, получаемых с помощью StackWalker.
static interface  StackWalker.StackFrame
Объект StackFrame представляет вызов метода, возвращенный StackWalker.

Краткое описание методов

Модификатор и тип Метод Описание
void forEach(Consumer<? super StackWalker.StackFrame> action)
Выполняет заданное действие для каждого элемента потока StackFrame текущего потока, начиная с верхнего кадра стека, которым является метод, вызывающий этот метод forEach.
Class<?> getCallerClass()
Получает объект Class вызывающего метода, который вызвал метод, вызвавший getCallerClass.
static StackWalker getInstance()
Возвращает экземпляр StackWalker.
static StackWalker getInstance(StackWalker.Option option)
Возвращает экземпляр StackWalker с заданным параметром, указывающим, к каким сведениям о кадрах стека он может получить доступ.
static StackWalker getInstance(Set<StackWalker.Option> options)
Возвращает экземпляр StackWalker с заданным набором options, указывающим, к каким сведениям о кадрах стека он может получить доступ.
static StackWalker getInstance(Set<StackWalker.Option> options, int estimateDepth)
Возвращает экземпляр StackWalker с заданным набором options, указывающим, к каким сведениям о кадрах стека он может получить доступ.
<T> T walk(Function<? super Stream<StackWalker.StackFrame>, ? extends T> function)
Применяет заданную функцию к потоку StackFrame текущего потока, начиная с верхнего кадра стека, которым является метод, вызывающий этот метод walk.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание методов

getInstance

public static StackWalker getInstance()
Возвращает экземпляр StackWalker.

Этот StackWalker настроен на пропуск всех скрытых кадров; ссылка на класс не сохраняется.

Возвращает:
StackWalker, настроенный на пропуск всех скрытых кадров; ссылка на класс не сохраняется.

getInstance

public static StackWalker getInstance(StackWalker.Option option)
Возвращает экземпляр StackWalker с заданным параметром, указывающим, к каким сведениям о кадрах стека он может получить доступ.
Параметры:
option - stack walking option
Возвращает:
экземпляр StackWalker, настроенный с заданным параметром

getInstance

public static StackWalker getInstance(Set<StackWalker.Option> options)
Возвращает экземпляр StackWalker с заданным набором options, указывающим, к каким сведениям о кадрах стека он может получить доступ.

Если заданный options пуст, этот StackWalker настроен на пропуск всех скрытых кадров; ссылка на класс не сохраняется.

Параметры:
options - stack walking options
Возвращает:
экземпляр StackWalker, настроенный с заданными параметрами

getInstance

public static StackWalker getInstance(Set<StackWalker.Option> options, int estimateDepth)
Возвращает экземпляр StackWalker с заданным набором options, указывающим, к каким сведениям о кадрах стека он может получить доступ.

Если заданный options пуст, этот StackWalker настроен на пропуск всех скрытых кадров; ссылка на класс не сохраняется.

estimateDepth задает предполагаемое количество кадров стека, которые будет обходить этот StackWalker; StackWalker может использовать это значение как подсказку для определения размера буфера.

Параметры:
options - stack walking options
estimateDepth - предполагаемое количество кадров стека, которые необходимо обойти.
Возвращает:
экземпляр StackWalker, настроенный с заданными параметрами
Выбрасывает:
IllegalArgumentException - если estimateDepth <= 0

walk

public <T> T walk(Function<? super Stream<StackWalker.StackFrame>, ? extends T> function)
Применяет заданную функцию к потоку StackFrame текущего потока, начиная с верхнего кадра стека, которым является метод, вызывающий этот метод walk.

Поток StackFrame будет закрыт при возврате из этого метода. При повторном использовании закрытого объекта Stream<StackFrame> будет выброшено исключение IllegalStateException.

Примечание API:
Например, чтобы найти первые 10 вызывающих кадров, сначала пропустив кадры, класс-владелец которых находится в пакете com.foo:
List<StackFrame> frames = StackWalker.getInstance().walk(s ->
        s.dropWhile(f -> f.getClassName().startsWith("com.foo."))
         .limit(10)
         .toList());

Этот метод принимает параметр Function, который получает Stream<StackFrame>, вместо того чтобы возвращать Stream<StackFrame> и позволять вызывающему коду напрямую управлять потоком. Виртуальная машина Java может реорганизовывать стек управления потока, например с помощью деоптимизации. Принимая параметр Function, этот метод предоставляет доступ к кадрам стека через стабильное представление стека управления потока.

Параллельное выполнение фактически отключено, а выполнение конвейера потока происходит только в текущем потоке.

Примечание по реализации:
Реализация стабилизирует стек, привязывая кадр, предназначенный специально для обхода стека, и обеспечивает выполнение обхода стека выше привязанного кадра. При закрытии объекта потока или его повторном использовании будет выброшено исключение IllegalStateException.
Параметры типа:
T - тип результата применения функции к потоку кадров стека.
Параметры:
function - функция, которая принимает поток кадров стека и возвращает результат.
Возвращает:
результат применения функции к потоку кадров стека.

forEach

public void forEach(Consumer<? super StackWalker.StackFrame> action)
Выполняет заданное действие для каждого элемента потока StackFrame текущего потока, начиная с верхнего кадра стека, которым является метод, вызывающий этот метод forEach.

Этот метод эквивалентен вызову

walk(s -> { s.forEach(action); return null; });
Параметры:
action - действие, которое необходимо выполнить для каждого StackFrame стека текущего потока

getCallerClass

public Class<?> getCallerClass()
Получает объект Class вызывающего метода, который вызвал метод, вызвавший getCallerClass.

Этот метод фильтрует кадры отражения, MethodHandle и скрытые кадры независимо от параметров SHOW_REFLECT_FRAMES и SHOW_HIDDEN_FRAMES, с которыми настроен этот StackWalker.

Этот метод следует вызывать, когда в стеке присутствует кадр вызывающего метода. Если он вызван из самого нижнего кадра стека, будет выброшено исключение IllegalCallerException.

Этот метод выбрасывает исключение UnsupportedOperationException, если этот StackWalker не настроен с параметром RETAIN_CLASS_REFERENCE.

Примечание API:
Например, Util::getResourceBundle загружает пакет ресурсов от имени вызывающего кода. Он вызывает getCallerClass, чтобы определить класс, метод которого вызвал Util::getResourceBundle. Затем он получает загрузчик классов этого класса и использует его для загрузки пакета ресурсов. В этом примере вызывающим классом является MyTool.
class Util {
    private final StackWalker walker =
        StackWalker.getInstance(Set.of(Option.DROP_METHOD_INFO, Option.RETAIN_CLASS_REFERENCE));
    public ResourceBundle getResourceBundle(String bundleName) {
        Class<?> caller = walker.getCallerClass();
        return ResourceBundle.getBundle(bundleName, Locale.getDefault(), caller.getClassLoader());
    }
}

class MyTool {
    private final Util util = new Util();
    private void init() {
        ResourceBundle rb = util.getResourceBundle("mybundle");
    }
}
Эквивалентный способ найти вызывающий класс с помощью метода walk выглядит следующим образом (фильтрация кадров отражения, MethodHandle и скрытых кадров здесь не показана):
    Optional<Class<?>> caller = walker.walk(s ->
        s.map(StackFrame::getDeclaringClass)
         .skip(2)
         .findFirst());
Если метод getCallerClass вызван из метода, который является самым нижним кадром стека, например из метода static public void main, запущенного средством запуска java, или из метода, вызванного из потока, присоединенного через JNI, будет выброшено исключение IllegalCallerException.
Возвращает:
объект Class вызывающего метода, который вызвал этот метод.
Выбрасывает:
UnsupportedOperationException - если этот StackWalker не настроен с параметром Option.RETAIN_CLASS_REFERENCE.
IllegalCallerException - если кадра вызывающего метода нет, то есть если этот метод getCallerClass вызван из метода, являющегося последним кадром стека.

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/StackWalker.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API