我有一个类,它有一些方法,我想在每个方法之前和之后添加方法名的日志。
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");
}
理想情况下,我希望每个方法都能自动记录前后的日志,而不必每次都为每个方法调用log。
有办法做到这一点吗?我知道注释可能是一种选择,但我不认为我是第一个遇到这个问题的人。
有许多不同的方法来实现它。
首先,你可以使用Decorator Design Pattern。它允许您向对象添加一些额外的行为。下面是一个简短的例子:
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;
}
}
你可以这样使用它,或者通过一些Factory of Car Objects创建所有实例:
Car car = new CarDecorator(new SomeCar());
car.drive();
此外,您可以使用面向方面的编程(AOP)来实现您的目标。例如,使用AspectJ或者如果你使用Spring框架——Spring AOP。
另一个解决方案是使用Java EE拦截器,如果它在您的项目中可以接受的话。