Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于实现扩展接口的方法的建议_Java_Aspectj_Instanceof - Fatal编程技术网

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非常有用,但同时也不太可靠。它可能会遗漏实际存在建议的标记,发出“建议未应用”的警告等。