Heim > Java > javaLernprogramm > Hauptteil

Warum fängt AspectJ trotz Schnittstellen- und Methodenanmerkungen mit @Marker keine annotierten Klassen und Methoden ab?

Mary-Kate Olsen
Freigeben: 2024-10-23 23:02:30
Original
554 Leute haben es durchsucht

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

Annotationsvererbung für Schnittstellen und Methoden mit AspectJ emulieren

Frage:

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?

Antwort:

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.

Emulieren der Vererbung mit AspectJ:

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!