2015-08-21 33 views
1

我有一個類有一些方法,我想在每個方法之前和之後添加方法名稱的日誌。Java-如何在每個方法調用之前和之後自動調用方法

private void log(String msg){ 
     logger.info("================================="); 
     logger.info(msg); 
     logger.info("================================="); 
    } 

private void method1(){ 
     log("Here I want to print method name" + " :start"); 
     //do stuff 
     log("Here I want to print method name" + " :end"); 
    } 

private void method2(){ 
     log("Here I want to print method name" + " :start"); 
     //do stuff 
     log("Here I want to print method name" + " :end"); 
    } 

理想情況下,我希望每個方法都能自動記錄前後,而不必每次都爲每個方法調用日誌。

有沒有辦法做到這一點?我知道註釋可能是一種選擇,但我不認爲我是第一個遇到這個問題的人。

+5

您可以查看[面向方面的編程](https://en.wikipedia.org/wiki/Aspect-oriented_programming)。回到大學之後,我在[AspectJ](https://en.wikipedia.org/wiki/AspectJ)上開了一門課,它允許你在這裏問的問題。 – watery

+0

[在Java中調用方法之前和之後運行方法]的可能重複(http://stackoverflow.com/questions/9596991/run-a-method-before-and-after-a-called-method-in- java) – Swapnil

+0

一種可能性(如@watery提到的)是使用面向方面的編程。在這種情況下,由於您想在方法調用之前和之後執行某些操作,因此可以使用['@ Around'](http://docs.spring.io/spring/docs/current/spring-framework-reference/html /aop.html#aop-ataspectj-around-advice)建議。我會推薦閱讀[Spring AOP](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html)文檔(因爲我認爲它比理解更容易)定期的AspectJ文檔),以便理解這些概念。 – mkobit

回答

0

有很多不同的方法來實現它。

首先,您可以使用裝飾設計模式。它允許你添加一些額外的行爲對象。下面是簡單的例子:

public interface Car { 
    public String drive(); 
} 

public class SomeCar implements Car { 
    @Override 
    public String drive() { 
    return "Drive some car"; 
    } 
} 

public abstract class CarDecorator implements Car { 
    Car car; 

    public CarDecorator(Car newPizza) { 
    this.car = newPizza; 
    } 

    @Override 
    public String drive() { 
    //do somthing before 

    String result = car.drive(); 

    //do someething after 

    return result; 
    } 
} 

您可以通過一些工廠使用這樣的,或者使所有實例汽車對象:

Car car = new CarDecorator(new SomeCar()); 
car.drive(); 

此外,還可以使用面向方面編程(AOP)來實現你的目標。例如,使用AspectJ或者使用Spring Framework - Spring AOP

另一個解決方案是使用Java EE Interceptors,如果它在您的項目中可以接受。

相關問題