2015-08-21 45 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,如果它在您的项目中可以接受。

相关问题