Класс StackWalker
public final class StackWalker extends Object
Метод walk открывает последовательный поток StackFrame для текущего потока и применяет заданную функцию к потоку StackFrame. Поток возвращает элементы стека в порядке от верхнего кадра, представляющего точку выполнения, в которой был сгенерирован стек, к нижнему. Поток StackFrame закрывается, когда метод walk возвращает значение. Если попытка повторного использования закрытого потока осуществляется, IllegalStateException будет брошен.
Параметры обхода стека конфигурируют информацию о кадрах стека, полученную с помощью StackWalker. По умолчанию собираются имя класса и информация о методе, но не Class reference. Информацию о методах можно исключить, используя параметр DROP_METHOD_INFO. Объект класса можно сохранить для доступа с помощью параметра 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- действие, которое должно быть выполнено для каждого элемента стека текущего потока
getCallerClass
public Class<?> getCallerClass()
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. - Возвращает:
- объект класса вызывающего метода, вызвавшего этот метод.
- Исключения:
-
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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/StackWalker.html