2012-10-04 55 views
13

現在我正在使用java.util.logging來記錄我的Java項目中每個方法的入口點和出口點。調試時這對我非常有用。如何在Java中自動記錄方法的入口/出口?

我在每一方法的開頭這一段代碼和在端部具有一個類似:

if (logger.isLoggable(Level.FINER)) { 
    logger.entering(this.getClass().getName(), "methodName"); 
} 

其中「方法名」是該方法的名稱(硬編碼)。

所以我想知道是否有辦法自動執行此操作,而無需在每種方法中都包含此代碼。

回答

10

我建議使用Aspect Oriented Programming。

例如,使用AspectJ編譯器(其可以被集成到Eclipse,Emacs和其它的IDE),可以創建一段代碼像這樣的:

aspect AspectExample { 
    before() : execution(* Point.*(..)) 
    { 
     logger.entering(thisJoinPointStaticPart.getSignature().getName(), thisJoinPointStaticPart.getSignature().getDeclaringType() ); 

    } 

    after() : execution(* Point.*(..)) 
    { 
     logger.exiting(thisJoinPointStaticPart.getSignature().getName() , thisJoinPointStaticPart.getSignature().getDeclaringType() ); 

    } 
} 

這一方面後增加了一個記錄代碼並在類「Point」中執行所有方法之前。

+0

它可以在離線應用程序中工作嗎?哪些不在服務器上運行? –

+0

@ArturasM是的,AspectJ字節碼被編織到目標類中,因此它直接在JVM中執行。因此,符合Java規範的任何JVM都可以運行它。 – Keith