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

时间:2011-09-11 17:18:22

标签: 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

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

密切相关

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

2 个答案:

答案 0 :(得分:1)

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

为注释添加注释

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

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

答案 1 :(得分:0)

I don't actually know the classes in my aspect 

考虑到你在说什么,以及@Inherited不能用于除了类之外的任何事情,你隐含地希望AspectJ能够找到一个方法(或它的覆盖)实现和声明)注释。这远远超过了AspectJ所宣布的内容。

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

但是,如果您有权访问注释处理器,则可能存在解决方法。在这种情况下,您可以选择所有@Secure注释并使用反射在代码中运行,以便在编译时生成AspectJ代码,从而正确捕获所有方法实例。不容易,但可能。