尽管使用 @Marker 注释接口和方法,但 AspectJ 方面期望拦截带注释的类和方法不会触发。为什么 AspectJ 不拦截它们?
Java 中的注解继承有局限性。接口、方法或注解上的注解不能通过实现类、重写方法或使用带注解的注解的类来继承。如果超类中的注释类型带有 @Inherited 元注释,则只有类从超类继承注释。
由于 AspectJ 在 JVM 的限制内工作,因此需要一种解决方法模拟注释继承。一个技巧是编写一个方面,手动将注释添加到实现类和重写方法中:
<code class="java">public aspect MarkerAnnotationInheritor { // Implementing classes should inherit marker annotation declare @type: MyInterface+ : @Marker; // Overriding methods 'two' should inherit marker annotation declare @method : void MyInterface+.two() : @Marker; }</code>
此方面将注释添加到接口以及所有实现类和方法,从而消除了对文字注释的需要在那些元素上。方面到位后,所需的 AspectJ 拦截将按预期工作。
或者,可以将方面直接嵌入到界面中:
<code class="java">public interface MyInterface { void one(); void two(); public static aspect MarkerAnnotationInheritor { declare @type: MyInterface+ : @Marker; declare @method : void MyInterface+.two() : @Marker; } }</code>
将文件重命名为 MyInterface.aj 允许AspectJ 识别方面定义。请注意,方面声明中的修饰符可以省略,因为接口的嵌套成员是隐式公共静态的。
但是,由于 AspectJ 编译器问题,应显式声明静态以确保稳定性。
以上是为什么 AspectJ 不拦截带注释的类和方法,尽管使用 @Marker 注释了接口和方法?的详细内容。更多信息请关注PHP中文网其他相关文章!