如果方法使用@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
密切相关唯一的区别是他们使用类级注释,而我需要一个方法级注释。
答案 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代码,从而正确捕获所有方法实例。不容易,但可能。