是否可以将方法名存储在一个数组中,并计算它被调用了多少次?
is it possible to store method name in an array, and count how many times it has been called?
我需要模拟一个调用栈。现在我已经实现了我的堆栈,现在我想知道是否有办法将方法名称存储在数组中。
例如,我有一个循环 5 次的递归函数,所以堆栈将是:
recur() //fifth
recur() //fourth
recur() //third
recur() //second
recur() //first
但是有没有办法将它们存储到一个数组中并显示出来呢?我不必关心它在递归函数中做了什么,我只想显示堆栈的名称和序列以及它是如何工作的。
这是你问的?
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() return 一个字符串;
如果您只想知道函数被调用的频率,最简单的方法是使用计数器并在函数开始时递增它:
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.");
您可以在不向 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.
我需要模拟一个调用栈。现在我已经实现了我的堆栈,现在我想知道是否有办法将方法名称存储在数组中。
例如,我有一个循环 5 次的递归函数,所以堆栈将是:
recur() //fifth
recur() //fourth
recur() //third
recur() //second
recur() //first
但是有没有办法将它们存储到一个数组中并显示出来呢?我不必关心它在递归函数中做了什么,我只想显示堆栈的名称和序列以及它是如何工作的。
这是你问的?
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() return 一个字符串;
如果您只想知道函数被调用的频率,最简单的方法是使用计数器并在函数开始时递增它:
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.");
您可以在不向 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.