Spec-Zone.ru › OpenJDK 27

Класс 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)
Применяет заданную функцию к потоку StackFrames текущего потока, начиная с верхнего кадра стека, то есть с метода, вызывающего этот метод walk.

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

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создает и возвращает копию этого объекта.
boolean equals(Object obj)
Указывает, равен ли этот объект какому-либо другому.
protected void finalize()
Устарело, будет удалено: этот элемент API может быть удален в будущей версии.
Финализация устарела и может быть удалена в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения этого Object.
int hashCode()
Возвращает хеш-код этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Заставляет текущий поток ожидать пробуждения, обычно вследствие вызова метода notify или interrupt.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно вследствие вызова метода notify или interrupt, либо до истечения заданного промежутка реального времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно вследствие вызова метода notify или interrupt, либо до истечения заданного промежутка реального времени.

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

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)
Применяет заданную функцию к потоку StackFrames текущего потока, начиная с верхнего кадра стека, то есть с метода, вызывающего этот метод 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, 2026, 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.

Spec-Zone.ru

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