Spec-Zone.ru › OpenJDK 24

Класс 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. Объект класса можно сохранить для доступа с помощью параметра 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.

Методы, унаследованные от класса java.lang.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 - действие, которое должно быть выполнено для каждого элемента стека текущего потока

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

Spec-Zone.ru

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