2011-08-04 50 views
0

之前我推倒重來 - 我希望能夠插入調試的痕跡在我的代碼,如say("We are here.");,無需在每一個類中定義static void say()。它需要做System.out.println(s),並且全局開啓或關閉(doSay(false)),並且我也希望它能夠識別它被調用的類(as described here)。例如:編寫調試一個簡單的打印方法的Java

MyClass的:我們在這裏。

確實的Java已經有了這樣的工具嗎?

+1

爲什麼你需要重新定義每個類中的'static'函數?根據定義,'static'函數不需要實例,所以你可以從任何地方調用它們。 –

+0

可能重複的[Java,如何跟蹤函數調用](http://stackoverflow.com/questions/4677502/java-how-to-trace-functions-called) – CoolBeans

+0

@Karl:有沒有一種方法來定義它我可以在任何地方調用它,比如簡單的說(...)或者log(...),而不是'MyUtils.say(...)'? – Chap

回答

0

我不知道靜態導入!我結合從@ninetwozero,@karl和@erickson理念打造這樣的:

package myPkg; 
public class CLHUtilities { 

    private static boolean saying = false; 
    public static void tracing(boolean b) { 
     saying = b; 
    } 

    /* 
    * Technique taken from: 
    * http://stackoverflow.com/questions/282977/which-class-invoked-my-static-method 
    */ 
    public static void say(String s) { 
     if (saying) { 
      Throwable t = new Throwable(); 
      StackTraceElement[] trace = t.getStackTrace(); 
      String className = trace[1].getClassName(); 
      String whoCalledMe = null; 
      try { 
       whoCalledMe = Class.forName(className).getSimpleName(); 
      } catch (Exception e) { 
      } 
      System.out.println(whoCalledMe + ": " + s); 
     } 

    } 
} 

可以用來簡單地爲:

import static myPkg.CLHUtilities.*; 
: 
tracing(true); 
: 
say("We are here."); 

這完全符合我的需要。

1

最流行的Java日誌框架爲Log4J它做到這一點(和更多)。

查看here查看其他列表。

0

你可以使用Apache的Log4J一個記錄器,並完成類似logger.trace("We are here");。如果希望關閉該功能,請在配置中將日誌級別設置得更高(調試,警告,錯誤),並且日誌將會消失。

0

Java具有更高級的日誌工具,如log4j或logback。在那裏,你應該創建一個public static final Logger logger = Logger.getLogger(..)並使用記錄器來編寫debug/info/warn/error消息到你喜歡的任何地方。它們是高度可配置的 - 什麼和在哪裏登錄。

對於更簡單的情況(如果這是一個玩具項目),您可以簡單地用public static void log(..)方法定義一個類並在每個類中使用它。

0

爲什麼不在你的Main.java中靜態聲明一個函數,並全方位地使用它?

public class Main { 

    private static boolean debug; 

    public static void setDebug(boolean d) { Main.debug = d; } 

    public static void say(String s) { if(Main.debug) System.out.println(s); } 

} 

讓我知道這是否符合您的需求。

編輯:(直接至少,不)訂正代碼

+0

這實際上是我尋找的那種簡單性,除非我做錯了什麼,靜態say()不能引用'這個'。最重要的是,我希望能夠從任何地方調用say(),而無需限定;例如Main.say( 「東西」);在Java中可能嗎? – Chap

+1

'debug'和'setDebug'也可以做成'static'。 –

+0

我更新了代碼,以便它不再引用這個上下文(當它是靜態的時候,它不是一個聰明的舉動)。 – ninetwozero

3

使用SLF4j,不log4j的。它們都是由same author, CekiGülcü創建的,但SLF4J結合了使用log4j所獲得的知識,並查看了其他日誌軟件包中的進展。

SLF4J是許多不同的基礎日誌記錄系統的常用API,如log4j,java.util.logging包等。它也有自己的「原生」實現,即logback。

我喜歡它比log4j更好的一個原因是它支持消息模板。這些keep your code simpler.

此外,它可以讓我包括一個庫記錄,但讓我的圖書館的用戶選擇日誌實現。如果沒有這樣的事情,用戶可能必須爲我的庫配置日誌記錄,並且它不會與其他應用程序統一。