クリエイター:メタボ兔

ウェブやアプリの開発者で利用する色な技術やサーバーや開発環境の設定について共有する場

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」の条件を増やせば良いかと思いました。