Класс 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 |
Выполняет заданное действие для каждого элемента потока StackFrame текущего потока, начиная с верхнего кадра стека, которым является метод, вызывающий этот метод forEach. |
Class |
getCallerClass() |
Получает объект Class вызывающего метода, который вызвал метод, вызвавший getCallerClass. |
static StackWalker |
getInstance() |
Возвращает экземпляр StackWalker. |
static StackWalker |
getInstance |
Возвращает экземпляр StackWalker с заданным параметром, указывающим, к каким сведениям о кадрах стека он может получить доступ. |
static StackWalker |
getInstance |
Возвращает экземпляр StackWalker с заданным набором options, указывающим, к каким сведениям о кадрах стека он может получить доступ. |
static StackWalker |
getInstance |
Возвращает экземпляр StackWalker с заданным набором options, указывающим, к каким сведениям о кадрах стека он может получить доступ. |
<T> T |
walk |
Применяет заданную функцию к потоку StackFrame текущего потока, начиная с верхнего кадра стека, которым является метод, вызывающий этот метод walk. |
Подробное описание методов
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вызван из метода, являющегося последним кадром стека.
© 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