首页 > Java > java教程 > 正文

为什么 AspectJ 不拦截带注释的类和方法,尽管使用 @Marker 注释了接口和方法?

Mary-Kate Olsen
发布: 2024-10-23 23:02:30
原创
553 人浏览过

Why Doesn't AspectJ Intercept Annotated Classes and Methods Despite Interface and Method Annotations with @Marker?

使用 AspectJ 模拟接口和方法的注释继承

问题:

尽管使用 @Marker 注释接口和方法,但 AspectJ 方面期望拦截带注释的类和方法不会触发。为什么 AspectJ 不拦截它们?

答案:

Java 中的注解继承有局限性。接口、方法或注解上的注解不能通过实现类、重写方法或使用带注解的注解的类来继承。如果超类中的注释类型带有 @Inherited 元注释,则只有类从超类继承注释。

使用 AspectJ 模拟继承:

由于 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中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!