Heim >Java >javaLernprogramm >Kann AspectJ eine Annotationsvererbung für Schnittstellen und ihre Methoden erreichen?

Kann AspectJ eine Annotationsvererbung für Schnittstellen und ihre Methoden erreichen?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-24 00:35:30432Durchsuche

Can AspectJ Achieve Annotation Inheritance for Interfaces and Their Methods?

Kann AspectJ die Vererbung von Annotationen für Schnittstellen und ihre Methoden emulieren?

Die Vererbung von Java-Annotationen ist eingeschränkt, wobei Annotationen für Schnittstellen, Methoden usw. definiert sind Annotationen, die nicht von implementierenden Klassen, überschreibenden Methoden oder Klassen, die annotierte Annotationen verwenden, geerbt werden. Diese Einschränkung gilt für AspectJ, das innerhalb der JVM-Einschränkungen arbeitet.

Lösung: Emulation der Annotationsvererbung in bestimmten Fällen

Obwohl eine allgemeine Lösung für die Annotationsvererbung nicht verfügbar ist, gibt es eine Problemumgehung existiert für bestimmte Schnittstellen oder Methoden:

<code class="java">public aspect MarkerAnnotationInheritor {
  // Implementing classes inherit the marker annotation
  declare @type: MyInterface+ : @Marker;
  // Overriding 'two' method inherits the annotation
  declare @method : void MyInterface+.two() : @Marker;
}</code>

Implementierung:

  • ITDs (Inter-Type-Definitionen) fügen die Annotation manuell zur Schnittstelle hinzu und implementieren/ Überschreiben von Klassen/Methoden.
  • Die eigentliche Anmerkung auf der Schnittstelle oder Methode kann entfernt werden.

Ergebnis:

Das Konsolenprotokoll jetzt druckt:

execution(de.scrum_master.app.Application())
execution(void de.scrum_master.app.Application.two())

Alternative Lösung:

Der Aspekt kann in die Schnittstelle eingebettet werden, wodurch die Implementierung an einem Ort konsolidiert wird. Benennen Sie die Datei zur Compilererkennung in .aj um.

<code class="java">// MyInterface.aj

public interface MyInterface {
  void one();
  void two();
  
  public static aspect MarkerAnnotationInheritor {
    declare @type: MyInterface+ : @Marker;
    declare @method : void MyInterface+.two() : @Marker;
  }
}</code>

Das obige ist der detaillierte Inhalt vonKann AspectJ eine Annotationsvererbung für Schnittstellen und ihre Methoden erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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