Класс 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 |
Применяет заданную функцию к потоку StackFrames текущего потока, начиная с верхнего кадра стека, то есть с метода, вызывающего этот метод walk. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создает и возвращает копию этого объекта. |
boolean |
equals |
Указывает, равен ли этот объект какому-либо другому. |
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 |
Заставляет текущий поток ожидать пробуждения, обычно вследствие вызова метода notify или interrupt, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно вследствие вызова метода 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вызван из метода, являющегося последним кадром стека.
© 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.