Java 关于实现扩展接口的方法的建议
我试图就一个扩展接口的方法提出建议,该接口如下所示:Java 关于实现扩展接口的方法的建议,java,aspectj,instanceof,Java,Aspectj,Instanceof,我试图就一个扩展接口的方法提出建议,该接口如下所示: public interface StructureService { void delete(FileEntry entry); } public interface FileService extends StructureService { void dummy(); } 实现这些功能的类如下所示: public class DbStructureService implements StructureServic
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切入点,就不会匹配任何类;尽管有很多方法可以与之匹配
如果我将(org.service.FileService+)中的替换为(org.service.StructureService+)中的,
也可以正常工作
我试过用这个()等等做实验,但没有成功。如何在aspectj中实现这一点
编辑:
更新了实现接口的类的外观。我认为这个场景可能很难给出建议,因为DbFileService中没有被重写的方法。我想您的意思是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不支持的场景吗?在child类中没有真正的函数来提供建议谢谢,我感到困惑的原因是eclipse AJDT中似乎有一个错误。标记显示与此类型相关的所有签名的匹配。然而,在编译它时,works.AJDT非常有用,但同时也不太可靠。它可能会遗漏实际存在建议的标记,发出“建议未应用”的警告等。