Javaの呼び出し元を取得(Stacktrace)
概要
実装の時エラーのスタックトレース(Stack Trace)のように呼び出し元(階層)を表示したいとか表示したい場合がありますよね(実は自分もあまりないと思う)?その時やり方を紹介したいと思います。
ソースで説明
面倒なのでいきなりソース&コメントで何とかやります。
/** * 呼び出し元のスタックを取得 * * @return Stacktraceの文字列 */ private String getCalleStack() { // RuntimeExceptionを利用してスタックトレースを取得 StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); new RuntimeException().printStackTrace(pw); pw.flush(); String stacktrace = sw.toString(); // スタックトレースを文字列として取得し、改行で分割し、空行、"at"のみの行を捨てる List<String> lines = Arrays.stream(stacktrace.split("[ \t\n]")) .map(s -> s.trim()) .filter(s -> s.length() > 0 && !s.equals("at") && !s.contains("java.lang.Thread")) .collect(Collectors.toList()); // 例外名称を捨てる lines.remove(0); // それらを改行コードで接続する。 return lines.stream().collect(Collectors.joining("\n")); }
取得したくないクラス名や内容があったら「filter」の条件を増やせば良いかと思いました。