メソッドの呼び出し履歴を見る

題名そのまんま、メソッドがどこからどうやって呼び出されたかを見るユーティリティーを作ってみた。簡単なデバッグには結構使えるかも。


public final class LineInfomation {

private LineInfomation() {}

public static void dispLineNumber(PrintStream out) {
try {
throw new Exception();
} catch (Exception e) {
StackTraceElement[] elems = e.getStackTrace();
// 最初(i == 0)の要素はこのメソッドの情報なので、不要
for (int i = 1; i < elems.length; i++)
out.println(
elems[i].getLineNumber() + "行目:" +
elems[i].getClassName() + "." +
elems[i].getMethodName() + "\t(" +
elems[i].getFileName() + ")");
}
}
}


要は例外投げて、それを自分で受け取って、スタックトレースを出力するだけ。ただし、getStackTraceで取得できるStackTraceElementの配列の一番初めの要素には、このメソッドの情報が入ってるから拡張for文じゃなくて普通のfor文で回している。
あと、引数としてPrintStreamを要求しているけど、これは余計なお世話かも。デフォルトをSystem.outにしておいて、setOutput的なメソッド追加して、そこで出力先を切り替えられるほうが多分便利。
ただ、そうなるとファイル出力とかにも対応したくなるわけで、ちょっと面倒なことに*1

*1:Javaは入出力のクラス階層が複数あるから