実行中のクラス名やメソッド名の取得

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() が返す行番号の方が役に立つ