Tutorial Annotation JDK 1.5: valeurs

Technique > Annotation Java

3 - Les annotations avec valeurs

Nous allons voir dans ce chapitre une annotation un peu plus complète, possédant des valeurs.

1- Déclarer l'annotation Auteur

L'annotation Auteur possède plusieurs valeurs: le prénom et le nomDeFamille de l'auteur.

package com.btc.tutorial.annotation1;

import java.lang.annotation.*;

// Annotation accessible à l'execution
@Retention(RetentionPolicy.RUNTIME)

// Annotation associé à un type (Classe, interface)
@Target(ElementType.TYPE)

public @interface Auteur {
    String prénom();
    String nomDeFamille();
}
Fichier: Auteur.java

Les annotation peuvent être utilisées ou non au moment de l'execution selon la valeur de @Retention qui petu être:

@Retention=RetentionPolicy.SOURCE

Les annotations sont ignorées par le compilateur.
Dans ce cas, les annotations peuvent être utilisées par des outils de développement analysant le code source. Ce mode de fonctionnement est identique aux tags javadoc du précédent JDK (@autor, @version etc...).

@Retention=RetentionPolicy.CLASS

Les annotations sont compilées dans un .class, comme une classe ou une interface Java, mais le byte-code généré n'est pas chargé par la machine virtuelle Java au moment de l'execution. Cependant, des outils de développement peuvent charger ces annotations, évitant ainsi la tâche lourde consistant à analyser du code source Java.

@Retention=RetentionPolicy.RUNTIME

Les annotations sont compilées dans un .class, comme une classe ou une interface Java, et les annotations sont chargées par la machine virtuelle au moment de l'execution de l'application.

Les annotation peuvent être placées sur différents éléments Java selon la valeur de @Target:

@Target=TYPE

L'annotation se place sur une classe, une interface ou enum (nouveauté JDK 1.5) Java, mais pas sur une autre annotation.

@Target=FIELD

L'annotation se place sur un attribut.

@Target=METHOD

L'annotation se place sur une méthode.

@Target=PARAMETER

L'annotation se place sur le paramètre d'une méthode.

@Target=CONSTRUCTOR

L'annotation se place sur un constructuer.

@Target=LOCAL_VARIABLE

L'annotation se place sur une variable locale d'une méthode..

@Target=PACKAGE

L'annotation se place sur un package.

@Target=ANNOTATION_TYPE

L'annotation se place sur une annotation (méta annotation).

Quelques points à savoir sur la déclaration des annotations
  • Les annotations peuvent n'avoir entre 0 et n membre (un membre est une méthode ou un attribut).
  • Le membre d'une annotation peut être une autre annotation.
  • Une annotation ne peut pas avoir un membre de son propre type.
  • Contrairement aux methodes d'une interface, le membre d'une annotation peut avoir une valeur par défaut.
  • Toutes les Annotation étendent implicitement l'interface java.lang.annotation.Annotation.
  • Les annotation ne supportent pas l'héritage (mot clef extends interdit).
  • Les annotations ne peuvent pas implémenter d'interface.
  • Les méthodes des annotations ne peuvent pas avoir de paramètres .
  • Les méthodes des annotations ne peuvent pas avoir d'implémentation.
  • Les méthodes des annotations ne peuvent retourner que:des types Java primitif (int, double...), String, une autre annotation ou un tableau des types précédents.
  • Les méthodes des annotations ne peuvent pas avoir de clause throws .
  • Les méthodes des annotations ne peuvent pas être génériques (nouveauté du JDK 1.5.0) .
  • Les Annotation ne peuvent pas être des types paramétrés (nouveauté du JDK 1.5).

2- Spécifier l'annotation Auteur sur la classe Entreprise

Dans l'exemple suivant, nous créons une classe Java, en ajoutant l'annotation permettant de connaitre l'auteur du code:

package com.btc.tutorial.auteur;

// Spécifier l'annotation sur la classe 
@Auteur (
     prénom = "Thibault",
     nomDeFamille = "Cuvillier"
)
public class Entreprise {
    private String _nom;

    public String getNom() {
        return _nom;
    }

    public void setNom(String nom) {
        _nom = nom;
    }
}
Fichier: Entreprise.java

Quelques point à savoir sur l'utilisation d'une annotation:

  • Les propriétés sans valeur par défaut sont obligatoires
  • Si l'annotation se trouve sans un autre package, vous devez l'importer, comme pour une classe ou interface Java.
  • Vous pouvez déclarer une annotation avec les packages: @com.btc.tutorial.auteur.Auteur

3- Utiliser l'annotation Auteur

package com.btc.tutorial.auteur;

public class Main {
    public static void main(String argv[]) {

        // Tester si l'annotation est présente sur la classe
        if( Entreprise.class.isAnnotationPresent(Auteur.class) ) {

            // Récupérer une référence sur l'annotation
            Auteur auteur = Entreprise.class.getAnnotation(Auteur.class);

            // Récupérer les valeurs de l'annotation
            System.out.print("La classe Entreprise a été dévelopée par ");
            System.out.println(auteur.prénom() + " " + auteur.nomDeFamille());
        }
    }
}
Fichier: Main.java

Simple non?

Vous devez savoir maintenant::

  • qu'une annotation Java est déclarée par @interface
  • que @interface n'a rien à voir avec une interface
  • qu'une annotation contient des attibuts
  • qu'une annotation peut être lue au moment de la compilation-déploiement ou au moment de l'execution de l'application Java

Passons à l'étape suivante pour voir un autre exemple plus complet

(c) Business Technology Consulting 2005-2007