Heim >Java >javaLernprogramm >Warum fängt AspectJ trotz Schnittstellen- und Methodenanmerkungen mit @Marker keine annotierten Klassen und Methoden ab?
Trotz Annotation einer Schnittstelle und Methoden mit @Marker ein AspectJ-Aspekt, der erwartet wird Das Abfangen annotierter Klassen und Methoden wird nicht ausgelöst. Warum fängt AspectJ sie nicht ab?
Annotationsvererbung in Java weist Einschränkungen auf. Anmerkungen zu Schnittstellen, Methoden oder Anmerkungen werden nicht von implementierenden Klassen, überschreibenden Methoden oder Klassen, die annotierte Anmerkungen verwenden, vererbt. Nur Klassen erben Annotationen von Superklassen, wenn der Annotationstyp in der Superklasse die Metaannotation @Inherited trägt.
Da AspectJ innerhalb der Einschränkungen der JVM funktioniert, ist eine Problemumgehung erforderlich um die Vererbung von Anmerkungen zu emulieren. Ein Trick besteht darin, einen Aspekt zu schreiben, der die Annotation manuell zu den implementierenden Klassen und überschreibenden Methoden hinzufügt:
<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>
Dieser Aspekt fügt die Annotation zur Schnittstelle und allen implementierenden Klassen und Methoden hinzu, wodurch die Notwendigkeit wörtlicher Annotationen entfällt auf diesen Elementen. Wenn der Aspekt vorhanden ist, funktionieren die gewünschten AspectJ-Interceptions wie erwartet.
Alternativ kann der Aspekt direkt in die Schnittstelle eingebettet werden:
<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>
Das Umbenennen der Datei in MyInterface.aj ermöglicht AspectJ, um die Aspektdefinition zu erkennen. Beachten Sie, dass die Modifikatoren in der Aspektdeklaration weggelassen werden können, da verschachtelte Mitglieder von Schnittstellen implizit öffentliche Statik sind.
Aufgrund eines AspectJ-Compilerproblems sollte Statik jedoch aus Stabilitätsgründen explizit deklariert werden.
Das obige ist der detaillierte Inhalt vonWarum fängt AspectJ trotz Schnittstellen- und Methodenanmerkungen mit @Marker keine annotierten Klassen und Methoden ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!