已直接注释或在继承接口中注释的切入点匹配方法



考虑这个@PointCut,如果用@Secure注释对方法进行注释,就会触发它:

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

这对等方法非常有效

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

但是,有可能有一个Pointcut,当注释只存在于这样的超类/接口中时,它也会被触发吗?

interface Foo {
    @Secure
    public void secureMethod();
}
class SubFoo implements Foo {
    @Override
    public void secureMethod() {  // <--- execution of this method should be caught
        /* .... */
    }
}

编辑:

这似乎与带有注释的类的子类的@AspectJ切入点密切相关

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

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

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

也许这会奏效(尽管在这种情况下,你应该确保你的建议不会被多次调用(。

I don't actually know the classes in my aspect 

考虑到您所说的内容以及@Inherited不能用于除类之外的任何其他内容,您隐含地希望AspectJ能够完成确定方法(或其覆盖的实现和声明(是否被注释的工作。这比AspectJ所宣布的要多得多。

如果您的最终目标是保护某些代码,那么所有应该保护的方法都应该首先进行适当的注释。所以,你的问题的答案是否定的,在这种情况下这是不可能的,尤其是如果你对课程一无所知的话。

但是,如果您有权访问注释处理器,可能会有一个解决方法。在这种情况下,您可以选择所有的@Secure注释,并通过反射来处理代码,从而在编译时生成能够正确捕获所有方法实例的AspectJ代码。不容易,但有可能。

相关内容

  • 没有找到相关文章

最新更新