From 7a92909566d22741748d0a9c4303dcfc8af76ed0 Mon Sep 17 00:00:00 2001 From: Yasin Date: Tue, 7 Mar 2017 01:28:33 +0530 Subject: [PATCH] BAEL-608 - Introduction to Java9 StackWalking API (#1315) * yasin.bhojawala@gmail.com Evaluation article on Different Types of Bean Injection in Spring * Revert "yasin.bhojawala@gmail.com" This reverts commit 963cc51a7a15b75b550108fe4e198cd65a274032. * Fixing compilation error and removing unused import * Introduction to Java9 StackWalking API - yasin.bhojawala@gmail.com Code examples for the article "Introduction to Java9 StackWalking API" --- .../java9/stackwalker/StackWalkerDemo.java | 64 +++++++++++++++++++ .../stackwalker/StackWalkerDemoTest.java | 11 ++++ 2 files changed, 75 insertions(+) create mode 100644 core-java-9/src/main/java/com/baeldung/java9/stackwalker/StackWalkerDemo.java create mode 100644 core-java-9/src/test/java/com/baeldung/java9/stackwalker/StackWalkerDemoTest.java diff --git a/core-java-9/src/main/java/com/baeldung/java9/stackwalker/StackWalkerDemo.java b/core-java-9/src/main/java/com/baeldung/java9/stackwalker/StackWalkerDemo.java new file mode 100644 index 0000000000..ee2cf092cd --- /dev/null +++ b/core-java-9/src/main/java/com/baeldung/java9/stackwalker/StackWalkerDemo.java @@ -0,0 +1,64 @@ +package com.baeldung.java9.stackwalker; + +import java.lang.StackWalker.StackFrame; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class StackWalkerDemo { + + public void methodOne() { + this.methodTwo(); + } + + public void methodTwo() { + this.methodThree(); + } + + public void methodThree() { + List stackTrace = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE) + .walk(StackWalkerDemo::walkExample); + + printStackTrace(stackTrace); + + System.out.println("---------------------------------------------"); + + stackTrace = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE) + .walk(StackWalkerDemo::walkExample2); + + printStackTrace(stackTrace); + + System.out.println("---------------------------------------------"); + + String line = StackWalker.getInstance() + .walk(StackWalkerDemo::walkExample3); + System.out.println(line); + } + + private static List walkExample(Stream stackFrameStream) { + return stackFrameStream.collect(Collectors.toList()); + } + + private static List walkExample2(Stream stackFrameStream) { + return stackFrameStream.filter(frame -> frame.getClassName() + .contains("com.baeldung")) + .collect(Collectors.toList()); + } + + private static String walkExample3(Stream stackFrameStream) { + return stackFrameStream.filter(frame -> frame.getClassName() + .contains("com.baeldung") + && frame.getClassName() + .endsWith("Test")) + .findFirst() + .map(frame -> frame.getClassName() + "#" + frame.getMethodName() + ", Line " + frame.getLineNumber()) + .orElse("Unknown caller"); + } + + private void printStackTrace(List stackTrace) { + for (StackFrame stackFrame : stackTrace) { + System.out.println(stackFrame.getDeclaringClass() + .toString() + "#" + stackFrame.getMethodName() + ", Line " + stackFrame.getLineNumber()); + } + } +} diff --git a/core-java-9/src/test/java/com/baeldung/java9/stackwalker/StackWalkerDemoTest.java b/core-java-9/src/test/java/com/baeldung/java9/stackwalker/StackWalkerDemoTest.java new file mode 100644 index 0000000000..61c8440b87 --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/stackwalker/StackWalkerDemoTest.java @@ -0,0 +1,11 @@ +package com.baeldung.java9.stackwalker; + +import org.junit.Test; + +public class StackWalkerDemoTest { + + @Test + public void walkTheStack() { + new StackWalkerDemo().methodOne(); + } +}