2007-07-24
ログ用にファイル名、クラス名、メソッド名、行番号などを取得
ログなどにクラス名、メソッド名、行番号などを出力したい場合がある。
エラーや例外が発生した場合はスタックトレース情報が得られるので
そいつを拝借すればどこのクラスの何行目でエラーが発生したのかを
ログに出力させることができるが、エラーや例外でない普通の場合、
どうしたらよいか?
実はJ2SE1.4からThrowable#getStackTrace()が追加されたので
これをうまく使えば実現できる。
Throwable#getStackTrace()はStackTraceElement型の配列を返却する。
各要素がスタックに詰まれた要素(スタックフレーム)の一つとなっている。
スタックの一番上、つまり要素0番目がこのThrowableクラスを生成したメソッドを表す要素となる。
例えば、
ファイル名:Test.java、クラス名:Test、メソッド名:traceTest、 100行目: StackTraceElement[] ste = (new Throwable()).getStackTrace();
と書いたとすると、要素0番目は以下のようになる。
ste[0].getFileName() → Test.java ste[0].getClassName() → Test ste[0].getLineNumber() → 100 ste[0].getMethodName() → traceTest
もちろん、要素1番目以降はtraceTestメソッドの呼び出しメソッド…
要素2番目はそのまた呼び出しメソッド…と最後まで続いてゆく。
ここでは、Throwableだけど投げずに情報だけ抜き出して使うという技を使った*1。
ちなみにJ2SE5.0からはThread#getStackTrace()も追加されたので、
StackTraceElement[] ste = Thread.currentThread().getStackTrace();
みたいな使い方もあり。ただし、この場合要素0番目はスレッドになるので、
要素1番目が呼び出したメソッドとなる。
参考
Silver | Cash Advance | Debt Consolidation | Insurance | Free Credit Report at Nextindex.net
虎の穴 J2SE 5.0 入門 Concurrency Utilities No.2
StackTraceElement (Java 2 Platform SE 5.0)
- 447 http://www.google.co.jp/search?hl=ja&q=java+メソッド名 取得&btnG=Google+検索&lr=
- 334 http://www.google.co.jp/search?q=java+メソッド名 取得&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox
- 288 http://www.google.co.jp/search?hl=ja&source=hp&q=java+メソッド名+取得&lr=&aq=7r&oq=java+メソッド
- 223 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLD,GGLD:2004-53,GGLD:ja&q=WinCVSごった煮版
- 119 http://www.google.co.jp/search?hl=ja&q=java+クラス名+取得&lr=
- 108 http://www.google.co.jp/search?q=java+クラス名 Throwable+getStackTrace&sourceid=navclient-ff&ie=UTF-8&rlz=1B3GGGL_jaJP211JP211
- 96 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=BNN&q=WinCVS+ごった煮&btnG=検索&lr=lang_ja
- 88 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=EXCEL+自動リンク&num=50
- 72 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBkQFjAA&url=http://d.hatena.ne.jp/fumokmm/20070724/1185294796&rct=j&q=java 行番号 取得&ei=mDaPTKTrNoSdcan79PQM&usg=AFQjCNGpJKa-sx7XPAlkm6e1qlCf
- 65 http://www.google.co.jp/search?hl=ja&source=hp&q=java+行番号+取得&lr=&aq=9&oq=java+行