それは、配列内のメソッド名を格納し、それが呼び出された回数をカウントすることができますか?

ジェームズ・ウォン:

私は、コールスタックをシミュレートする必要があります。今、私はすでに配列内のメソッド名を格納するための方法がある場合は、今、私は思ったんだけど、私のスタックを実装しました。

例えば、私は5回ループ再帰関数を持っているので、スタックは次のようになります。

recur() //fifth 
recur() //fourth
recur() //third
recur() //second
recur() //first

しかしそこには、配列にそれらを格納し、それを表示するには、とにかくですか?私は、私はちょうどスタックとシーケンスとそれがどのように働くの名前を表示したい、それが再帰関数内で何をするかを気にする必要はありません。

エセキエル:

あなたはに新しいパラメータを渡すことなく、呼び出しの数を数えることができるrecur方法。

recursiveMethodCount 現在のスタックトレースをフィルタリングし、ocurrencesをカウントします。

import java.util.Arrays;

public class StackTrace {

    public static void main(String[] args) {
        recur();
    }

    public static void recur() {
        long recursionLevel = recursiveMethodCount("StackTrace", "recur");
        if (recursionLevel < 10) {
            System.out.println(String.format("Recursion level is %d, invoking recur() again.", recursionLevel));
            recur();
        } else {
            System.out.println(String.format("Recursion level is %d, no more invocations.", recursionLevel));
        }
        System.out.println(String.format("Recursion level is %d, returning.", recursionLevel));
    }

    public static long recursiveMethodCount(String declaringClass, String methodName) {
        return Arrays.stream(Thread.currentThread().getStackTrace())
                .filter(stackTraceElement -> stackTraceElement.getClassName().equals(declaringClass))
                .filter(stackTraceElement -> stackTraceElement.getMethodName().equals(methodName))
                .count();

    }
}

このコードの出力は、

Recursion level is 1, invoking recur() again.
Recursion level is 2, invoking recur() again.
Recursion level is 3, invoking recur() again.
Recursion level is 4, invoking recur() again.
Recursion level is 5, invoking recur() again.
Recursion level is 6, invoking recur() again.
Recursion level is 7, invoking recur() again.
Recursion level is 8, invoking recur() again.
Recursion level is 9, invoking recur() again.
Recursion level is 10, no more invocations.
Recursion level is 10, returning.
Recursion level is 9, returning.
Recursion level is 8, returning.
Recursion level is 7, returning.
Recursion level is 6, returning.
Recursion level is 5, returning.
Recursion level is 4, returning.
Recursion level is 3, returning.
Recursion level is 2, returning.
Recursion level is 1, returning.

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=338742&siteId=1