我在我的代码中使用System.out.println来跟踪程序的执行并获得一些有用的输出。这会在控制台中创建如下结果:
Main function. Program starts.
Method getArea. Getting values
Method getSide. Side is 6
Method getArea. First value is 6
Method getSide. Side is 8
Method getArea. Second value is 8
Method getArea. Area is 48
Main function. The final area is 48
我想创建tha方法,每次代码在方法调用堆栈中更深入时,都会在输出前添加一个空格。例如,相同的代码,而不是使用System.out.println,现在使用Misc.smartPrintln:
Main function. Program starts.
Method getArea. Getting values
Method getSide. Side is 6
Method getArea. First value is 6
Method getSide. Side is 8
Method getArea. Second value is 8
Method getArea. Area is 48
Main function. The final area is 48
该方法将具有以下定义:
public static void smartPrintln(String string);
我不知道如何实现此功能。任何想法如何解决这个问题?并且,使用记录器可以提供此功能吗?
答案 0 :(得分:5)
创建一个临时的Throwable对象。 使用其getStackTrace()方法分析堆栈并确定级别。 e.g。
public static void smartPrintln(String string) {
Throwable t = new Throwable();
StackTraceElement[] stackElements = t.getStackTrace();
int level = stackElements.length - 1; // don't forget our function adds a level
for (int i = 0; i < level; i++) {
System.out.print(' '); // could probably make this more efficient
}
System.out.println(string);
}
答案 1 :(得分:2)
有趣的问题。 @ ob1建议的更简洁的实现:
public static void smartPrintln(String string) {
int i = new Throwable().getStackTrace().length - 1;
System.out.printf("%"+i+"s%s%n", "", string);
}
另一种解决方案是将“功能”直接添加到System.out.println
这样的调用:
System.setOut(new PrintStream(System.out) {
public void println(String x) {
printf("%"+(new Throwable().getStackTrace().length - 1)+"s", "");
super.println(x);
}
});
在此之后,对System.out.println(String)
的所有调用都将由我们的“过滤”PrintStream实现处理。
答案 2 :(得分:0)
使用Logger API或任何其他第三方API。