Можно ли сохранить имя метода в массиве и посчитать, сколько раз он был вызван? - PullRequest
2 голосов
/ 20 марта 2020

Мне нужно смоделировать стек вызовов. Теперь я уже реализовал свой стек, теперь мне интересно, есть ли способ сохранить имя метода в массиве.

Например, у меня есть функция рекурсии, которая зацикливается 5 раз, поэтому стек будет:

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

, но есть ли способ сохранить их в массив и отобразить его? Мне не нужно заботиться о том, что он делает внутри функции рекурсии, я просто хочу отобразить имя стека и последовательность и как это работает.

Ответы [ 3 ]

2 голосов
/ 20 марта 2020

Вы можете посчитать количество вызовов, не передавая новый параметр методу recur.

recursiveMethodCount фильтрует текущую трассировку стека и подсчитывает вхождения.

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.
1 голос
/ 20 марта 2020

Если вы просто хотите узнать, как часто вызывается функция, самым простым способом было бы использовать счетчик и увеличивать его в начале функции:

static int recur_counter = 0;
???? recur() {
    recur_counter++;
    // And now do whatever you actually wanted to do.
}

И после того, как вы закончили вызывать Функция, которую вы можете просто напечатать результат:

System.out.println("recur() was executed " + recur_counter + " times.");
1 голос
/ 20 марта 2020

Это то, что вы спрашиваете?

    List<String> listName=new ArrayList<String>();
        listName.add(recur());
        listName.add(recur());
        listName.add(recur());
        listName.add(recur());
        listName.add(recur());


        System.out.println(listName);
        System.out.println(listName.size());

В этом примере recur () возвращает строку;

...