スレッド呼び出しスタックを正しく使用して親呼び出し関数の名前を取得する

1376 ワード

Thread.currentThread().getStackTrace()[1].getMethodName()を使用して現在の関数名を取得するのは問題ありません.私の問題は、上位2レベルの呼び出し関数の名前を取得する必要があります.大体このようなコードです.
public class A {
    protected final String getId() {
        //  [  .   ]     
        Thread.currentThread().getStackTrace()[3].getMethodName();
    }
    protected final <T> T getXXX() {
        return otherCall(getId());
    }
}
public class B extends A{
    public myClass myCall(){
        return getXXX();
    }

私の考えでは、StackTraceの0はGetStackTrace、1はgetId、2はgetXXX、3はmyCallなので、myCall関数の名前を返すには3を使うべきで、結果は、実行後にgetXXXに戻って、呼び出しスタックを出してみると、私が想像していたのとは違って、同名のgetXXX関数がいくつも増えていて、改めて考えてみると、springを使って、開発環境でjrebelを使って、この2つのものが一番好きなのは、楽屋で動的エージェントクラスをこっそり生成してあげることです.問題はここにあると思います.仕方がありません.フィルタコードを作るしかありません.
private final String getId() {
		StackTraceElement[] se = Thread.currentThread().getStackTrace();
		//    0  "getStackTrace"  , 1     
		String s = se[1].getMethodName();
		//    "getId"         "getId"     ,                    
		for(int i = 2, n = se.length, count = 0; i < n; ++i) {
			String v = se[i].getMethodName();
			if(s.equals(v)) continue;
			s = v;
			//             ,              
			if(++count >= 2) break;
		}
		return getClass().getSimpleName() + "." + s;
	}

コンパイル、実行、ははは、今回やっと正しい、記念を残して、同じ問題に直面した他の人を助けることができることを望んでいます.