AspectJ peut-il émuler l'héritage d'annotations pour les interfaces et leurs méthodes ?
L'héritage d'annotations Java est restreint, avec des annotations définies sur les interfaces, les méthodes ou annotations non héritées de l'implémentation de classes, de méthodes de remplacement ou de classes utilisant des annotations annotées. Cette limitation s'applique à AspectJ, qui fonctionne dans le cadre des contraintes JVM.
Solution : émuler l'héritage d'annotations dans des cas spécifiques
Bien qu'une solution générale pour l'héritage d'annotation ne soit pas disponible, une solution de contournement existe pour des interfaces ou des méthodes spécifiques :
<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>
Implémentation :
Résultat :
Le journal de la console maintenant prints :
execution(de.scrum_master.app.Application()) execution(void de.scrum_master.app.Application.two())
Solution alternative :
L'aspect peut être intégré dans l'interface, consolidant ainsi l'implémentation en un seul endroit. Renommez le fichier en
<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>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!