Programmation Java/Méta-données
Un livre de Wikibooks.
| Programmation |
| Java |
| Sommaire |
| IHM avec SWING |
| Annexes |
| Modifier ce modèle |
Un nouveau principe introduit par Java 5 est la gestion des méta-données grâce à un mécanisme appelé annotations.
En fait, le fonctionnement est similaire à celui qu'on trouve déjà dans les commentaires Javadoc et avec des outils comme XDoclet.
Sections |
[modifier] Fonctionnement
Toute entité (classe, interface, méthode ou champ) peut être précédée d'une ou plusieurs annotations contenant des méta-données renseignant le compilateur ou documentant l'entité.
[modifier] Syntaxe
La syntaxe d'une annotation est la suivante :
@annotation-type[ (name=value) * ]
La liste des paramètres entre parenthèse est optionnelle (vide par défaut). Elle contient une série de valeurs associées à un nom de champ définit par l'annotation.
Exemple 1 :
@Author( name = "Moi", date = "02/01/2009" ) class MyClass() { }
Exemple 2 :
@Override void uneMethode() { }
[modifier] Annotations existantes
Beaucoup d'annotation complètent les balises spéciales pour la documentation Javadoc.
[modifier] @Deprecated
Cette annotation marque une entité obsolète. Son utilisation génère un avertissement à la compilation.
[modifier] @Override
Cette annotation marque une méthode redéfinie.
[modifier] @SuppressWarnings
Cette annotation signale au compilateur de supprimer certains avertissements à la compilation de l'entité.
Exemple 1 : pour supprimer les avertissements d'utilisations de méthodes obsolètes :
@SuppressWarnings("deprecation") void uneMethode() { methodeObosolete(); }
Exemple 2 : pour supprimer les avertissements d'utilisations de méthodes obsolètes et d'utilisation de méthodes sans vérification de types (une version de la méthode avec types générique est préférable afin que le type d'élément soit vérifié) :
@SuppressWarnings({"unchecked", "deprecation"}) void uneMethode() { Vector v=new Vector(); methodeObosolete(); }
[modifier] Créer de nouvelles annotations
La création est similaire à celle d'une interface.
[modifier] Syntaxe
@interface identifiant {
type champ() [ default valeur ];
}
Exemple de définition:
@interface InfoClasse { String auteur(); int revision() default 1; String[] references(); }
Exemple d'utilisation:
@InfoClasse( auteur="Moi", references={"Reference1","Reference2"} ) class UneClasse { }
[modifier] Documentation pour Javadoc
Si l'annotation définit des informations à afficher dans la documentation générée par Javadoc, la définition de l'annotation doit utiliser l'annotation @Documented.
Correction de l'exemple précédent :
@Documented @interface InfoClasse { String auteur(); int revision() default 1; String[] references(); }
[modifier] Informations disponibles à l'exécution
Pour que les informations d'une annotation soit disponible à l'exécution, il faut annoter sa définition avec @Retention(RetentionPolicy.RUNTIME).
Exemple :
import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @interface AnnotationPourExecution { // Éléments d'information disponibles à l'exécution }
[modifier] Restreindre l'utilisation d'une annotation
La définition d'une annotation peut être annotée avec @Target pour spécifier avec quels types d'élément l'annotation peut être utilisée.
La classe java.lang.annotation.ElementType définit les différents types qu'il est possible d'annoter.
Exemple :
import java.lang.annotation.*; @Target(ElementType.ANNOTATION_TYPE) @interface PourAutreAnnotation { } @Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE}) @interface InfoMembreOuType { // Type = class/interface/enum }