Maison  >  Article  >  Java  >  AspectJ peut-il réaliser l'héritage d'annotations pour les interfaces et leurs méthodes ?

AspectJ peut-il réaliser l'héritage d'annotations pour les interfaces et leurs méthodes ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-24 00:35:30310parcourir

Can AspectJ Achieve Annotation Inheritance for Interfaces and Their Methods?

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 :

  • Les ITD (définitions inter-types) ajoutent manuellement l'annotation à l'interface et implémentent/ remplacement des classes/méthodes.
  • L'annotation réelle sur l'interface ou la méthode peut être supprimée.

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 .aj pour la reconnaissance du compilateur.

<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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn