更智能的println,显示堆栈中的深度

时间:2010-06-02 11:52:23

标签: java debugging

我在我的代码中使用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);

我不知道如何实现此功能。任何想法如何解决这个问题?并且,使用记录器可以提供此功能吗?

3 个答案:

答案 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。