Maison > Java > javaDidacticiel > le corps du texte

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

Patricia Arquette
Libérer: 2024-10-24 00:35:30
original
312 Les gens l'ont consulté

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>
Copier après la connexion

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())
Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!