Thread.currentThread() を参照することで、
スレッド名 → Thread.currentThread().getName()
クラス名 → Thread.currentThread().getStackTrace()[1].getClassName()
メソッド名 → Thread.currentThread().getStackTrace()[1].getMethodName()
で取得できるので、以下のように staticメソッドのユーティリティクラスを用意すれば、、、
public static String getClassName(){ return Thread.currentThread().getStackTrace()[2].getClassName(); } public static String getMethodName(){ return Thread.currentThread().getStackTrace()[2].getMethodName(); }
と思うが、落とし穴があって、ラムダ式の中で実行すると、
lambda$1 のように、メソッド名が取得できても役に立たない場合がある。
それなら、ラムダの場合は、コード上の行番号を付加したものを返す約束にすれば使えそうだ。
工夫して作ったのが以下のとおり。
public final class CurrentUtil{ private CurrentUtil(){} /** * @return 実行中スレッド名 */ public static String getThreadName(){ return Thread.currentThread().getName(); } /** * @return 実行中クラス名 */ public static String getClassName(){ return Thread.currentThread().getStackTrace()[2].getClassName(); } /** * 実行中メソッド名取得. * @return 実行中メソッド名 */ public static String getMethodName(){ return Optional.of(Thread.currentThread().getStackTrace()[2]) .map(e->e.getMethodName().startsWith("lambda$") ? e.getMethodName() + ":" + e.getLineNumber() : e.getMethodName()) .get(); } }
startsWithでラムダなんて判断しないで、以下の様にと考えもしたが、
Optional.of(Thread.currentThread().getStackTrace()[2]) .map(e->e.getClassName() + "." + e.getMethodName() + ":" + e.getLineNumber()) .get();
実際のラムダ式が使用されてるメソッドまできちんと出すには、getStackTrace()の配列をきちんと
順に解析しないとならない。
それよりも、getLineNumber() が返す行番号の方が役に立つ