首頁  >  文章  >  Java  >  為什麼 AspectJ 不攔截帶註解的類別和方法,儘管使用 @Marker 註解了介面和方法?

為什麼 AspectJ 不攔截帶註解的類別和方法,儘管使用 @Marker 註解了介面和方法?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-23 23:02:30558瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn