dimanche 10 octobre 2010

Les méta-annotations standards

Résume
Ce billet à pour but d'expliquer ce que c'est que les méta-annotations; ce sont des annotation appliqué au annotation lors de la définition;bien que  Java SE5 propose quatre annotations dédiées aux types d'annotations.
Il existe trois types d'annotations :
Jusqu’ici, nous nous sommes préoccupés que par :
• Des marqueurs (markers) : ces annotations ne possèdent pas d'attribut.
Rappel :@Override, @Deprecated ,@SuppressWarning et @Generated dans j’ai pas parlé la dernier fois car, elle a était intégré dans Java 6 .
Ces quatre annotations sont dites Built-In annotation, car ils sont prédéfinis dans la JDK.
Bien qu’il existe d’autres types d’annotations :
Les annotations simples (single value annotations) : ces annotations ne possèdent qu'un seul attribut.
Les annotations complètes (full annotations) : ces annotations possèdent plusieurs attributs.
Les utilisations des annotations concernent plusieurs fonctionnalités :
• Utilisation par le compilateur pour détecter des erreurs ou ignorer des avertissements, c’est ce qu’on a vu jusqu'à présent avec les annotations Buit-in.
Documentation
Génération de code (Jusqu'à Java 6 que nous allons voir sur le Billet Amélioration apporter à l’annotation)
Génération de fichiers (Jusqu'à Java 6 que nous allons voir sur le Billet Amélioration apporter à l’annotation)


Exemple d’utilisation :
Supposons que je veux créer mes propres annotations et les exploitées :
pendant l’exécution du code lui-même.
• par d’autres outils qui viendront exploiter soit les fichiers sources (.java), soit les fichiers de byte codes (.class) ;
Je préfère commencer par un simple exemple dans lequel je veux crée une annotation @Copyright qui sera afficher dans mon fichier (.class), pour dire que je suis le propriétaire de cette classe et après donné une explication des différents Méta-annotation , et faire l’appel de cette annotation sur le type Class.


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.CLASS)// l’annotation sera conservée dans les fichiers .class
@Target(ElementType.TYPE)// déclarations de type class


public @interface Copyright {


String value();//dans le cas ou on un seul attribut value est l’attribut par défaut.
//attention à ne pas la confondre avec une méthode c’est un attribut.
//vers la fin de ce Billet on verra comment faire l’appel de cette annotation dans une //classe est qui si on vérifie au niveau du fichier (.class) on trouvera la valeur de //l’appel qu’on a spécifié au niveau de @Retention.


}


Explication des différents Méta-annotation :


Il est possible d’annoter une annotation lors de sa définition, On parle alors de méta-annotations, La version Java 5 propose quatre annotations dédiées aux types d'annotations :
L'annotation :
@Target : Spécifie à quelles entités il sera possible de l’appliquer


ElementType.ANNOTATION_TYPE annotations
ElementType.CONSTRUCTOR constructeurs
ElementType.FIELD champs
ElementType.LOCAL_VARIABLE variables locales
ElementType.METHOD méthodes
ElementType.PACKAGE package
ElementType.PARAMETER paramètres d’une méthode ou d’un constructeur
ElementType.TYPE déclarations de type (class, inteface ou énumération)


L'annotation :
@Retention "durée de vie",


RetentionPolicy.SOURCE L’annotation ne sera conservée que dans les fichiers sources. Elle ne pourra donc plus être exploitée lors de l’exécution (par introspection, notamment). Elle restera toutefois exploitable par des outils d’analyse de fichiers sources.


RetentionPolicy.CLASS L’annotation sera conservée dans les fichiers .class, (en plus des fichiers sources) mais ne sera pas accessible à la machine virtuelle.
L’instrospection ne sera pas possible. L’annotation pourra cependant être exploitée par des outils qui travaillent directement sur des fichiers .class.
Il s’agit de la durée de vie par défaut (c’est-à-dire lorsque aucune méta-annotation @Retention ne figure devant la définition de l’annotation.


RetentionPolicy.RUNTIME L’annotation sera conservée dans les fichiers .class, (en plus des fichiers sources) et sera accessible à la machine virtuelle. L’instrospection sera possible.
L'annotation :


@Documented : Marquer les annotations que vous souhaitent voir prises en compte dans un outil de documentation automatique de code.


L'annotation :
@Inherited : prévoir, lors de sa définition, qu’une annotation sera héritée.


Appel de l’annotation sur une classe :
@Copyright("2010 Naoufal Ben Bouazza")
En bas de l’annotation la classe sur la quelle elle sera appliquée.
Remarque : Dans Java SE 6, la prise en compte des annotations est intégrée dans le compilateur : ceci permet un traitement à la compilation des annotations sans avoir un recours à un outil tiers comme apt.

dimanche 3 octobre 2010

Les Annotations en (Java SE version 6, alias Mustang)

Motivation
Les annotations s'impose aujourd'hui comme une alternative pour la configuration des fichiers XML.
Nous regarderons d’abord le principe de base des annotations (Java SE version 5, alias Tiger) propose seulement trois annotations, puis les améliorations apportées aux annotations en (Java SE version 6, alias Mustang), puis si possible celles des librairies facilitant la manipulation du XML.
Avec Java SE 6, on en voit arriver d’autres dans les packages javax.annotation ou javax.xml.bind.annotation. Mais ce sont surtout les frameworks et autres Standards qui font la part belle aux annotations : Hibernate, JPA, JDO, Spring, Guice, Java EE6... Le plus souvent il s'agit de remplacer de longs fichiers de description en XML par les annotations .
Bien que mon but reste de traiter les annotations dans JUnit 4.x.  dans les tests unitaires.




Présentation
Dans cette premier partie nous allons nous pencher sur une fonctionnalité qui ont été rajoutée depuis (Java SE version 5, alias Tiger) qui a été l'introduction des annotations ( marqueurs ) donc permet de marquer certain élément du langage Java qui sont ensuite utilisé à la compilation ou à l'exécution afin d'automatiser certains tâches.


Les annotations Java peuvent être ajoutées aux:
 Classes.
 Méthodes.
 Attributs.
 Paramètres.
 Variables locales .
 Paquets(package).


Syntaxe


Déclaration:
la déclaration d'une annotation se fait au moyenne d'une interface, mis à part le symbole @ devant le mot-clef interface qui permet de spécifier qu'il s'agit d'une interface :


public @interface MyAnnotation {




}


Utilisation:
Puisque les annotation sont un type du langage Java ,elles peuvent être utilisée sur plusieurs type d'éléments tel que j'ai mentionné en haut .Plusieurs annotations différentes peuvent être utilisées sur un même élément mais on ne peut pas utiliser deux fois la même annotation. En général l'annotation est placée devant la déclaration de l'élément qu'elle marque :
/*Annotation utilisé sur le type class */
@MyAnnotation


public class MyClass {


/* ... */


}
Les Annotations standards ( (Java SE version 5, alias Tiger) propose seulement trois annotations)
L'annotation @Override (ne peut être utilisée que sur une méthode. )
public class Entreprise {


@Override public String toString() {


return ....
}
...
}
 Cette annotation indique que la méthode est la redéfinition d'une méthode définie dans une super classe.
Elle permet, par exemple, de se prémunir contre les fautes de frappe: si vous définissez la méthode toStrinh à la place de toString par exemple, une erreur de compilation signalera que la méthode marquée par @Override n'est pas définie dans la super classe.
 
L'annotation @Deprecated(remplace le tag javadoc. )
public class Entreprise {




@Deprecated public String vieilleMethode {


return ....


}


...


}
Cette annotation remplace le tag javadoc pour signaler qu'une méthode n'est conservé que pour assurer la compatibilité avec la version précédente, et que cette méthode ne doit plus être utilisée.
L'annotation @SuppressWarnings (contient la liste des warnings à masquer.)
 
public class Entreprise {




@SuppressWarnings({"unchecked"}) public String méthode() {


List list = new ArrayList();


list.add("Warning avec le JDK 1.5.0");


}


...


}
Les nouveauté du JDK 1.5.0 peuvent provoquer l'affichage de warning, alors que le code compilait sans warning dans la version précédente. Pour pouvoir supprimer ces warning, vous pouvez ajouter l'annotation @SuppressWarnings devant la méthode concernée.
Remarquez que si vous ajoutez @SuppressWarnings pour supprimer un warning sur une classe, et que vous en ajoutez un autre pour un autre warnings sur une méthode, les deux warnings seront supprimées de la méthode lors de la compilation.


Attention, les noms des warnings ne sont pas standardisés entre les compilateurs Java.
Créer ces propres annotations
 Les annotation sont compilées par le compilateur Java et les valeurs sont stockées dans le fichier .class. Une annotation est un objet Java qui peut être accédée par la machine virtuelle (l'application Java) ou un autre programme ( la commande apt du JDK 1.5.0 ).
On peut créer une annotation très simple, permettant de marquer les classes Java dont les objets sont persistants, etc ...
Lien utile:
JSR-175 : http://www.jcp.org/en/jsr/detail?id=175