考虑这个@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代码。不容易,但有可能。