1.
new Exception().printStackTrace(printStream)
Печатает стек-трейс в текстовом виде в поток. Первой строкой выводится
toString()
объекта Exception
, далее стек вызовов до места создания исключения. Соответственно, из потока нужно будет достать и распарсить вторую строку. В зависимости от JVM формат вывода может отличаться.2.
Thread.currentThread().getStackTrace()
3.
new Exception().getStackTrace()
Более красивые способы. Возвращают уже массив готовых объектов-фреймов, нужно только взять первый элемент. Эти вызовы дорогие, они всегда загружают весь стек, даже если нужен первый фрейм. От класса-владельца метода в возвращаемом
StackTraceElement
доступна только строка имени, для доступа через Reflection придется загружать его вручную.4.
StackWalker.getInstance(options, depth).walk(s -> ...)
Самый продвинутый способ, доступный с Java 9 – специально предназначенный для этого класс. Параметрами метода
getInstance()
можно ограничивать необходимую глубину и детализацию стека. Результаты – экземпляры StackFrame
– содержат готовый для рефлекшна Class<?>
вызывающего объекта.