java - 直接或在继承接口(interface)中注释的切入点匹配方法?

标签 java inheritance reflection annotations aspectj

考虑这个 @PointCut,如果一个方法被 @Secure 注释注释,它会被触发:

@Pointcut("execution(@Secure * *(..)) && @annotation(secure)")
public void accessOperation(final Access access) { }

这非常适用于以下方法:

class Foo {
    @Secure
    public void secureMethod() { }
}

但是是否有可能有一个 Pointcut 当注解只存在于像这样的父类(super class)/接口(interface)中时也会被触发?

interface Foo {

    @Secure
    public void secureMethod();
}

class SubFoo implements Foo {

    @Override
    public void secureMethod() {  // <--- execution of this method should be caught
        /* .... */
    }
}

编辑:

这似乎与以下内容密切相关:@AspectJ pointcut for subclasses of a class with an annotation

唯一的区别是他们使用类级别的注释,而我需要方法级别的注释。

最佳答案

我不知道 AspectJ 在这种情况下如何处理注解,但如果他只检查实现类的某个注解,并且该注解仅在类实现的接口(interface)上找到,Java 将报告事实上该注释不存在于类方法中。你应该用@Inherited 来注释你的注解:

http://download.oracle.com/javase/6/docs/api/java/lang/annotation/Inherited.html

也许这可以解决问题(尽管在这种情况下您应该确保您的 Advice 不会被多次调用)。

关于java - 直接或在继承接口(interface)中注释的切入点匹配方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7379933/

相关文章:

java - 在哪里可以看到我在工作区中创建的新文件?

java - 动态添加或修改字符串资源

c++ - 当基类具有虚函数时,对基类的静态转换会产生意想不到的结果

java - Animal a = new Horse() 和 Horse c = new Horse() 之间的区别

c++ - 继承类中没有构造函数时如何抛出异常?

java - 在 Java 反射中将 int 转换为 Enum

java - 单击按钮将回收器 View 滚动到特定位置

java - 在配置单元中创建表异常?

java - guava 可以用于反射按名称加载的类吗?

go - 在 protobuf 文件中使用 google.protobuf.Value 并在结构中使用 go interface{} 字段,反之亦然