2012年12月5日水曜日

実行中のメソッド名やクラス名を取得する方法

サーブレットの中でエラー理由と行番号を出力させたいのですが、Java2SDK1.3のプログラムの中で、C言語の__LINE__のように現在の行番号を出力させることは可能なのでしょうか?

回答は可能です。方法は以下です。

new Throwable()やThread.currentThread()のgetStackTrace()を使用すると、このクラスはStackTraceElement型の配列を返却するので、 呼び出し元のスタックフレームの情報を得ることができます。

またエラーではないときの、スタックトレースなどにも使用できます。

Throwable#getStackTrace()はJ2SE1.4から追加されています。
Thread#getStackTrace()はJ2SE5.0から追加されています。

この配列つまりスタックの最初である0番目の要素が、Throwableクラスを生成したメソッドを表す要素となります。
スポンサーリンク
new Throwable().getStackTrace()[0].getMethodName()
または
Thread.currentThread().getStackTrace()[0].getMethodName()
このようにすると、このコードが書かれている部分のメソッド名を取得することができます。
getFileName() ファイル名 Test.java
getClassName() クラス名 Test
getMethodName() メソッド名 traceTest
getLineNumber() 行数・行番号 100
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
for (StackTraceElement stackTraceElement : stackTraceElements) {
System.out.println("-----------------------------");
System.out.println("ClassName : " + stackTraceElement.getClassName());
System.out.println("FileName : " + stackTraceElement.getFileName());
System.out.println("MethodName : " + stackTraceElement.getMethodName());
System.out.println("LineNumber : " + stackTraceElement.getLineNumber());
System.out.println("-----------------------------");
}

0 件のコメント:

コメントを投稿