关于实现扩展接口的方法的建议

时间:2011-09-20 12:19:34

标签: java aspectj instanceof

我正在尝试围绕扩展接口的方法提出建议:

public interface StructureService {
    void delete(FileEntry entry);
}

public interface FileService extends StructureService {
     void dummy();
}

实现这些的类如下所示:

public class DbStructureService implements StructureService {
    public void delete(FileEntry entry) {
    }
}
public class DbFileService extends DbStructureService implements FileService {
    public void dummy() {
    }
}

我正在尝试匹配delete方法,但仅适用于实现FileService的类。

我定义了以下方面:

public aspect FileServiceEventDispatcherAspect {
    pointcut isFileService() : within(org.service.FileService+);

    pointcut delete(FileEntry entry) :
        execution(void org.service.StructureService.delete(..))
        && args(entry) && isFileService();

    void around(FileEntry entry) : delete(entry)  {
            proceed(entry);
    }
}

问题是只要我启用了isFileService切入点,就不会匹配任何类;即使有很多方法可以匹配这个

如果我将within(org.service.FileService+)替换为within(org.service.StructureService+),它也可以正常工作。

我尝试过尝试过这个()等但没有成功。我如何在aspectj中执行此操作?

编辑: 更新了实现接口的类的外观。我认为这种情况可能很难建议,因为DbFileService

中没有重写方法

1 个答案:

答案 0 :(得分:1)

我想你的意思是DbFileService实现FileService而不是StructureService。鉴于此,此代码应该有效:

public aspect FileServiceEventDispatcherAspect {    

pointcut delete(FileService this_, FileEntry entry) :
    execution(void org.service.StructureService.delete(..))
    && args(entry) && this(this_);

void around(FileService this_, FileEntry entry) : delete(this_, entry)  {
        proceed(this_, entry);
}
}

“内部”切入点不适用于此处,因为它是“基于词汇结构的切入点”("AspectJ in Action", second edition.