JAVA:将侦听器附加到接口实现

JAVA:将侦听器附加到接口实现,java,Java,我有一个现有的接口: public interface ActionInterface<T> { Result<T> execute(); } public abstract class ActionInterface<T> { public Result<T> execute() { //obtain property value via reflection or similar - it depends on the use

我有一个现有的接口:

public interface ActionInterface<T> {
  Result<T> execute();
}
public abstract class ActionInterface<T> {
  public Result<T> execute() {
    //obtain property value via reflection or similar - it depends on the use case, it could be included in base class
    log.debug(property);
    return doExecute();
  }

  protected abstract Result<T> doExecute();
}
公共接口ActionInterface{
结果执行();
}
和示例实现

public class MyAction<T> implements ActionInterface<T> {
  @Override public Result<T> execute() {
    file.write(this.property);
    return Result();
  }
}
公共类MyAction实现ActionInterface{
@重写公共结果执行(){
file.write(this.property);
返回结果();
}
}
我想监听对.execute的调用,并在调用时调用
log.debug(obj.property)
。 完成这项工作的最佳方法是什么

请注意,可能会有更多的接口实现-我想听听所有这些实现

您有两个选择

  • 使用一些面向方面的编程库,如AspectJ或
  • 实现模板模式
  • 如果只是出于日志记录的目的,那么首先要做的就是

    对于2),可以使用抽象类而不是接口:

    public interface ActionInterface<T> {
      Result<T> execute();
    }
    
    public abstract class ActionInterface<T> {
      public Result<T> execute() {
        //obtain property value via reflection or similar - it depends on the use case, it could be included in base class
        log.debug(property);
        return doExecute();
      }
    
      protected abstract Result<T> doExecute();
    }
    
    公共抽象类ActionInterface{
    公共结果执行(){
    //通过反射或类似方式获得属性值-这取决于用例,它可以包含在基类中
    log.debug(属性);
    return doExecute();
    }
    受保护的抽象结果doExecute();
    }
    
    您可以使用
    @拦截器
    ,但您如何计划事先知道这是哪个属性?也许在接口中使用抽象的
    getProperty()
    ,这样做会更容易,如果我正确理解第二个选项-我们需要修改每个现有的实现来调用ActionInterface方法?不。客户端调用execute()方法。这将调用
    doExecute
    ,这是每个具体类都应该实现的方法。