スタックトレース
これは、探しているものに大きく依存します...しかし、これは、このオブジェクト内でこのメソッドを直接呼び出したクラスとメソッドを取得する必要があります。
- インデックス 0 = スレッド
- インデックス 1 = これ
- インデックス 2 = 直接の呼び出し元、自分自身にすることができます。
- インデックス 3 ... n = インデックス 2 以下を取得するために互いに呼び出したクラスとメソッド。
クラス/メソッド/ファイル名の場合:
Thread.currentThread().getStackTrace()[2].getClassName();
Thread.currentThread().getStackTrace()[2].getMethodName();
Thread.currentThread().getStackTrace()[2].getFileName();
授業のために:
Class.forName(Thread.currentThread().getStackTrace()[2].getClassName())
参考までに: Class.forName() は、ランタイムではない ClassNotFoundException をスローします。キャッチしてみる必要があります。
また、クラス自体内の呼び出しを無視する場合は、その特定のものをチェックするロジックを使用してループを追加する必要があります。
みたいな... (私はこのコードをテストしていないので注意してください)
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
for(int i=2;i<stes.length;i++)
if(!stes[i].getClassName().equals(this.getClass().getName()))
return stes[i].getClassName();
スタックウォーカー
スタック ウォーカー スタックフレーム
これは広範なガイドではなく、可能性の例であることに注意してください。
各 StackFrame のクラスを出力します (クラス参照を取得することにより)
StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE)
.forEach(frame -> System.out.println(frame.getDeclaringClass()));
同じことを行いますが、最初にストリームをリストに収集します。デモンストレーションのみを目的としています。
StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE)
.walk(stream -> stream.collect(Collectors.toList()))
.forEach(frame -> System.out.println(frame.getDeclaringClass()));