儘管使用@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中文網其他相關文章!