2010-06-02 40 views
1

我在我的代碼中使用System.out.println來跟蹤程序的執行並獲得一些有用的輸出。這會在控制檯這樣的結果:智能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); 

我不知道該怎麼實現這個功能。任何想法如何解決這個問題?而且,記錄器的使用是否可以提供這種功能?

回答

5

創建一個臨時的Throwable對象。 使用其getStackTrace()方法分析堆棧並確定級別。 例如

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); 
} 
+0

Big +1 to ob1 - 我從來沒有想過這個令人驚訝的醜陋但有用的黑客攻擊。 – 2010-06-02 13:14:09

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實現進行處理。

+0

不錯。作爲一個選項,考慮Thread.currentThread()。getStackTrace()而不是新的Throwable()。getStackTrace() - 避免了「醜陋」的拋出throwable。 – tucuxi 2010-06-02 16:45:11

0

使用Logger API或任何其他第三方API。