StackWalker
  public
  
  final
  
  class
  StackWalker
  
    extends Object
  
  
  
  
  
  
| java.lang.Object | |
| ↳ | java.lang.StackWalker | 
A stack walker.
 The walk method opens a sequential stream
 of StackFrames for the current thread and then applies
 the given function to walk the StackFrame stream.
 The stream reports stack frame elements in order, from the top most frame
 that represents the execution point at which the stack was generated to
 the bottom most frame.
 The StackFrame stream is closed when the walk method returns.
 If an attempt is made to reuse the closed stream,
 IllegalStateException will be thrown.
 
 The stack walking options of a
 StackWalker determines the information of
 StackFrame objects to be returned.
 By default, stack frames of the reflection API and implementation
 classes are hidden
 and StackFrames have the class name and method name
 available but not the Class reference.
 
 StackWalker is thread-safe. Multiple threads can share
 a single StackWalker object to traverse its own stack.
 A permission check is performed when a StackWalker is created,
 according to the options it requests.
 No further permission check is done at stack walking time.
Summary
| Nested classes | |
|---|---|
| 
        
        
        
        
        interface | StackWalker.StackFrameA  | 
| Public methods | |
|---|---|
| 
        
        
        
        
        
        void | 
      forEach(Consumer<? super StackWalker.StackFrame> action)
      Performs the given action on each element of  | 
| 
        
        
        
        
        
        Class<?> | 
      getCallerClass()
      Gets the  | 
| 
        
        
        static
        
        
        StackWalker | 
      getInstance(Set<StackWalker.Option> options)
      Returns a  | 
| 
        
        
        static
        
        
        StackWalker | 
      getInstance()
      Returns a  | 
| 
        
        
        static
        
        
        StackWalker | 
      getInstance(Set<StackWalker.Option> options, int estimateDepth)
      Returns a  | 
| 
        
        
        static
        
        
        StackWalker | 
      getInstance(StackWalker.Option option)
      Returns a  | 
| 
        
        
        
        
        <T>
        T | 
      walk(Function<? super Stream<StackWalker.StackFrame>, ? extends T> function)
      Applies the given function to the stream of  | 
| Inherited methods | |
|---|---|
Public methods
forEach
public void forEach (Consumer<? super StackWalker.StackFrame> action)
Performs the given action on each element of StackFrame stream
 of the current thread, traversing from the top frame of the stack,
 which is the method calling this forEach method.
 
This method is equivalent to calling
 walk(s -> { s.forEach(action); return null; });
 
    | Parameters | |
|---|---|
| action | Consumer: an action to be performed on eachStackFrameof the stack of the current thread | 
getCallerClass
public Class<?> getCallerClass ()
Gets the Class object of the caller who invoked the method
 that invoked getCallerClass.
 
 This method filters frames, MethodHandle, and
 hidden frames regardless of the
 SHOW_REFLECT_FRAMES
 and SHOW_HIDDEN_FRAMES options
 this StackWalker has been configured with.
 
 This method should be called when a caller frame is present.  If
 it is called from the bottom most frame on the stack,
 IllegalCallerException will be thrown.
 
 This method throws UnsupportedOperationException
 if this StackWalker is not configured with the
 RETAIN_CLASS_REFERENCE option.
API Note:
- For example, Util::getResourceBundleloads a resource bundle on behalf of the caller. It invokesgetCallerClassto identify the class whose method calledUtil::getResourceBundle. Then, it obtains the class loader of that class, and uses the class loader to load the resource bundle. The caller class in this example isMyTool.class Util { private final StackWalker walker = StackWalker.getInstance(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"); } }walkmethod is as follows (filtering the reflection frames,MethodHandleand hidden frames not shown below):Optional<Class<?>> caller = walker.walk(s -> s.map(StackFrame::getDeclaringClass) .skip(2) .findFirst());getCallerClassmethod is called from a method that is the bottom most frame on the stack, for example,static public void mainmethod launched by thejavalauncher, or a method invoked from a JNI attached thread,IllegalCallerExceptionis thrown.
| Returns | |
|---|---|
| Class<?> | Classobject of the caller's caller invoking this method. | 
| Throws | |
|---|---|
| UnsupportedOperationException | if this StackWalkeris not configured withOption.RETAIN_CLASS_REFERENCE. | 
|  | if there is no caller frame, i.e.
         when this getCallerClassmethod is called from a method
         which is the last frame on the stack. | 
getInstance
public static StackWalker getInstance (Set<StackWalker.Option> options)
Returns a StackWalker instance with the given options specifying
 the stack frame information it can access.  If the given options
 is empty, this StackWalker is configured to skip all
 hidden frames and no
 class reference is retained.
 
 If a security manager is present and the given options contains
 Option.RETAIN_CLASS_REFERENCE,
 it calls its checkPermission
 method for RuntimePermission("getStackWalkerWithClassReference").
| Parameters | |
|---|---|
| options | Set:stack walking option | 
| Returns | |
|---|---|
| StackWalker | a StackWalkerconfigured with the given options | 
| Throws | |
|---|---|
| SecurityException | if a security manager exists and its checkPermissionmethod denies access. | 
getInstance
public static StackWalker getInstance ()
Returns a StackWalker instance.
 
 This StackWalker is configured to skip all
 hidden frames and
 no class reference is retained.
| Returns | |
|---|---|
| StackWalker | a StackWalkerconfigured to skip all
 hidden frames and
 no class reference is retained. | 
getInstance
public static StackWalker getInstance (Set<StackWalker.Option> options, int estimateDepth)
Returns a StackWalker instance with the given options specifying
 the stack frame information it can access. If the given options
 is empty, this StackWalker is configured to skip all
 hidden frames and no
 class reference is retained.
 
 If a security manager is present and the given options contains
 Option.RETAIN_CLASS_REFERENCE,
 it calls its checkPermission
 method for RuntimePermission("getStackWalkerWithClassReference").
 
 The estimateDepth specifies the estimate number of stack frames
 this StackWalker will traverse that the StackWalker could
 use as a hint for the buffer size.
| Parameters | |
|---|---|
| options | Set:stack walking options | 
| estimateDepth | int: Estimate number of stack frames to be traversed. | 
| Returns | |
|---|---|
| StackWalker | a StackWalkerconfigured with the given options | 
| Throws | |
|---|---|
| IllegalArgumentException | if estimateDepth <= 0 | 
| SecurityException | if a security manager exists and its checkPermissionmethod denies access. | 
getInstance
public static StackWalker getInstance (StackWalker.Option option)
Returns a StackWalker instance with the given option specifying
 the stack frame information it can access.
 
 If a security manager is present and the given option is
 Option.RETAIN_CLASS_REFERENCE,
 it calls its checkPermission
 method for RuntimePermission("getStackWalkerWithClassReference").
| Parameters | |
|---|---|
| option | StackWalker.Option:stack walking option | 
| Returns | |
|---|---|
| StackWalker | a StackWalkerconfigured with the given option | 
| Throws | |
|---|---|
| SecurityException | if a security manager exists and its checkPermissionmethod denies access. | 
walk
public T walk (Function<? super Stream<StackWalker.StackFrame>, ? extends T> function)
Applies the given function to the stream of StackFrames
 for the current thread, traversing from the top frame of the stack,
 which is the method calling this walk method.
 
The StackFrame stream will be closed when
 this method returns.  When a closed Stream<StackFrame> object
 is reused, IllegalStateException will be thrown.
API Note:
- For example, to find the first 10 calling frames, first skipping those frames
 whose declaring class is in package com.foo:List<StackFrame> frames = StackWalker.getInstance().walk(s -> s.dropWhile(f -> f.getClassName().startsWith("com.foo.")) .limit(10) .collect(Collectors.toList()));This method takes a Functionaccepting aStream<StackFrame>, rather than returning aStream<StackFrame>and allowing the caller to directly manipulate the stream. The Java virtual machine is free to reorganize a thread's control stack, for example, via deoptimization. By taking aFunctionparameter, this method allows access to stack frames through a stable view of a thread's control stack.Parallel execution is effectively disabled and stream pipeline execution will only occur on the current thread. 
Implementation Note:
- The implementation stabilizes the stack by anchoring a frame
 specific to the stack walking and ensures that the stack walking is
 performed above the anchored frame. When the stream object is closed or
 being reused, IllegalStateExceptionwill be thrown.
| Parameters | |
|---|---|
| function | Function: a function that takes a stream of
                 stack frames and returns a result. | 
| Returns | |
|---|---|
| T | the result of applying the function to the stream of stack frame. | 
Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
Last updated 2025-02-10 UTC.
