Programmation Java/Méta-données

Un livre de Wikibooks.

Programmation
Java
Logo java.JPG
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
}
Autres langues