Java et les annotations



Documents pareils
La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Programmer en JAVA. par Tama

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

1. Installation d'un serveur d'application JBoss:

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Héritage presque multiple en Java (1/2)

Auto-évaluation Programmation en Java

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

TP1 : Initiation à Java et Eclipse

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Remote Method Invocation (RMI)

Plan du cours. Historique du langage Nouveautés de Java 7

Cours 1: Java et les objets

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

RMI le langage Java XII-1 JMF

Web Tier : déploiement de servlets

Composants Logiciels. Le modèle de composant de CORBA. Plan

Création d une application JEE

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

LOG4430 : Architecture logicielle et conception avancée

Une introduction à la technologie EJB (2/3)

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Environnements de développement (intégrés)

INITIATION AU LANGAGE JAVA

Java Aspect Components (JAC)

as Architecture des Systèmes d Information

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Programmation Par Objets

Programmation par les Objets en Java

Compte Rendu d intégration d application

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Plan. Department of Informatics

Programmation en Java IUT GEII (MC-II1) 1

TP1. Outils Java Eléments de correction

Java 1.5 : principales nouveautés

Chapitre 10. Les interfaces Comparable et Comparator 1

Cours en ligne Développement Java pour le web

OpenPaaS Le réseau social d'entreprise

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Remote Method Invocation en Java (RMI)

7 Développement d une application de MapReduce

Calcul Parallèle. Cours 5 - JAVA RMI

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

TD/TP PAC - Programmation n 3

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Création d un service web avec NetBeans 5.5 et SJAS 9

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Développement Web - Object Relational Mapping and Hibernate

Architecture Orientée Service, JSON et API REST

Java Licence Professionnelle CISII,

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

PROGRAMMATION PAR OBJETS

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

La gestion de la persistance avec Hibernate. Hibernate et la gestion de persistance. La gestion de la persistance (1/2) Introduction

Refonte front-office / back-office - Architecture & Conception -

Programmation Objet Java Correction

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

4. SERVICES WEB REST 46

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Une introduction à Java

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Bases Java - Eclipse / Netbeans

Package Java.util Classe générique

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

Corrigé des exercices sur les références

Remote Method Invocation Les classes implémentant Serializable

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Java DataBaseConnectivity

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Programmation par composants (1/3) Programmation par composants (2/3)

Généralités sur le Langage Java et éléments syntaxiques.

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Europa. Développement JEE 5. avec Eclipse. K a r i m D j a a f a r. A v e c l a c o n t r i b u t i o n d e O l i v i e r S a l v a t o r i

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

Java au cœur de la base de données Oracle

Threads. Threads. USTL routier 1

EJB3.1 - ORM - Object-Relational Mapping

Présentation. Au programme. Fonctionnement. A l issue de ce module vous devriez...

Développement Logiciel

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

Cours Master Recherche RI 7 Extraction et Intégration d'information du Web «Services Web»

Un ordonnanceur stupide

Votre premier projet Android

Alfstore workflow framework Spécification technique

Initiation à JAVA et à la programmation objet.

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Introduction à JDBC. Accès aux bases de données en Java

Point sur les solutions de développement d apps pour les périphériques mobiles

Ingénierie des Modèles. Méta-modélisation

Cedric Dumoulin (C) The Java EE 7 Tutorial

LOG4430 : Architecture logicielle et conception avancée

Projet de programmation (IK3) : TP n 1 Correction

Transcription:

Java et les annotations Cnam Paris jean-michel Douin version du 6 Octobre 2014 Notes de cours sur les annotations 1

Sommaire Les prédéfinies Annotation pour une meilleure productivité Annotations comme un nouveau langage Annotation installée par le programmeur Annotation et introspection Annotation et MVC 2

Principale bibliographie Le guide http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html http://java.sun.com/docs/books/tutorial/java/javaoo/annotations.html JavaWorld les indispensables http://www.javaworld.com/javaworld/jw-07-2004/jw-0719-tiger3_p.html http://www.javaworld.com/javaworld/jw-08-2005/jw-0801- annotations_p.html http://www.javaworld.com/javaworld/jw-10-2005/jw-1003-mvc_p.html AOP et les annotations http://www.onjava.com/pub/a/onjava/2004/08/25/aoa.html?page=1 JUnit4 http://www-128.ibm.com/developerworks/java/library/j-junit4.html http://www.java201.com/resources/browse/14-2005.html Stamps http://sourceforge.net/projects/stamps-mvc/ 3

Les prédéfinies Interaction avec le compilateur @Deprecated le compilateur affichera un «warning» public class AnnotationDeprecated{ @Deprecated public void uneméthodedépréciée(){ 4

Les prédéfinies @Override cette méthode devrait être masquée, redéfinie public class AnnotationOverride extends Object{ @Override public boolean equals(object o){ return ; Le compilateur vérifiera qu il s agit bien d une méthode «masquée» 5

Les prédéfinies @SuppressWarning public class AnnotationSuppressWarning{ @SuppressWarnings({"unchecked") public. Voir javac Xlint all,deprecation,unchecked,fallthrough,path,serial,finally 6

Annotations? Au juste qu est-ce que c est? Des metadonnées du programme 'décorant' le code Un nouveau langage? Une prise en charge des traitements fastidieux? Une aide à la productivité? Les annotations sont interprétées par, les pré-compilateurs, le compilateur, le chargeur de classes et la JVM 7

Exemple cossu d emblée @Entity public class Animal implements Serializable { Annotated as Entity @Column(name="animalName") String name; String kind; String weight; @ManyToOne Pavilion pavilion; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id;... @Id denotes primary key Génération automatique de fichiers de configuration, xml, script sql,. Productivité, nouveau langage, lisibilité, le fastidieux est supprimé 8

Un autre exemple, page79 livre d antonio Chapitre Object/Relational Mapping @Entity public class Book{ @Id @GeneratedValue(strategy=GenerationType.AUTO) private long Id; private Float price; @ElementCollection(fetch = FetchType.LAZY) @CollectionTable(name= "tag ") @Column(name= "Value") private ArrayList<String> tags; Productivité?, nouveau langage?, lisibilité?, suppression du fastidieux, discussion 9

Annotations edit compile deploy classload run Annotations proposées par un fournisseur de logiciels, EJB3.0, JUnit4, Modern Jass, JML 10

Comment et quand les annotations sont elles exploitées? edit compile deploy classload run Plusieurs possibilités Lisibles par l'homme comme commentaire du code source Meta données d'aide à l' IDE Annotation processing API (JSR-269) pendant compilation Lisibles au chargement (BCEL-Byte Code Engineering Library une API Java permettant d'analyser, de créer et de manipuler des fichiers.class) Lisibles par introspection au runtime 11

Annotations comme commentaires edit compile deploy classload run Annotations comme commentaires typés @Deprecated, // déjà vue : les prédéfinies versus /* évitez d'utiliser cette méthode */ 12

annotations et AGL edit compile deploy classload run Renseigner l'agl et/ou le compilateur au delà des possibilités du langage 13

Annotation traitées à la compilation edit compile deploy classload run Peut générer du source interfaces, objets, procédures, code, fichiers xml,.. RPC stubs, LocalHome interfaces, deployment descriptors exemples: EJB 14

annotations et fichiers.class edit compile deploy classload run exemple: @TransactionAttribute(REQUIRED) Insère du code transactionnel autour du code de la procédure ainsi annotée. Le patron décorateur, proxy 15

annotations et runtime (JUnit 4) edit compile deploy classload run JUnit 4 test runner découvre les classes annotées, les instancie, execute les méthodes annotées Les classes de Test ne doivent plus hériter de TestCase, les méthodes peuvent ne plus commencer par test @Test(expected = IndexOutOfBoundsException.class) public void empty() { List l = new ArrayList<Object>(); l.get(0); // should throw exception /* Avant en junit3 */ public void testempty() { try{ List l = new ArrayList<Object>(); l.get(0); // should throw exception fail( should throw exception ); catch(exception e){ asserttrue(e instanceof IndexOutOfBoundsException); 16

annotations et runtime (Hibernate) edit compile deploy classload run Vérification de contraintes dans un conteneur Exemple: Hibernate @NotEmpty @Length(min = 2, max = 50) public String getlastname () { return ; // runtime exception! 17

annotations et runtime (ModernJass) edit compile deploy classload run Vérification de contraintes à l exécution,@pre,@post,@invariant @Invariant( @ForAll(Object o : data;o!=null) ) public class Liste { public Object [ ] data ; @Post ( @Old(size)+1==size ) public void add(object o ){... 18

annotations et runtime (cofoja + moderne que ModernJass) edit compile deploy classload run Vérification de contraintes à l exécution,@requires,@ensures,@invariant import com.google.java.contract.requires; public class Liste { public Object [ ] data ; @Requires ( o!=null ) public void add(object o ){... javac -cp.;cofoja-1.1-r150.jar -javaagent:cofoja-1.1-r150.jar contrats.liste.java java -cp.;cofoja-1.1-r150.jar -javaagent:cofoja-1.1-r150.jar contrats.main 19

annotations et runtime (Google Juice) edit compile deploy classload run Injection de code à l exécution @Inject public Cours(ServiceI service){ this.service = service; private @Inject ServiceI service; 20

Guice3.0 D autres annotations D autres annotations existent http://code.google.com/docreader/#p=google-guice&s=google-guice&t=usersguide @ImplementedBy @providedby @Singleton @Provides @CheckedProvides @RequestScoped @SessionScoped Chaque API proposerait-elle ses propres annotations? Serions nous envahis par les annotations? 21

Annotation installée par le «programmeur» edit compile deploy classload run A quelles fins? Orientation outils, logiciels de base, Langage maison? Perdre les programmeurs Java? ou bien deviennent ils annotés? (EJB, JPA) 22

Un exemple, une nouvelle annotation declaration @interface Author { String name(); int year(); usage @Author(name = Walter Harley,year =2008) class MyClass { Où annoter le code? @Target Une méta-annotation Quand, à quelle phase est-elle utilisée? @Retention Édition, compilation, exécution 23

Où annoter le code? @A class X { @A @B( quux ) public void foo(@c x) {... @B private String s; Syntaxiquement ce sont des "modifiers", comme final. Les Annotations peuvent être appliquées à toutes les déclarations: types (y compris enums et annotation), attributs, constructeurs, méthodes, paramètres, enum, packages, et variables locales. 24

Annotations pour Annotation @Target Quelles sont les structures du langage annotées TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, c.f. java.lang.annotation Enum ElementType @Retention A quel moment? SOURCE, CLASS, RUNTIME c.f. java.lang.annotation Enum RetentionPolicy @Documented L annotation doit être documentée @Inherited L annotation est héritée c.f. java.lang.annotation 25

Exemples @ACompléter @DBTable @Pre, @Post @xxxxdetypage 26

Exemple «RetentionPolicy.SOURCE» @ACompléter mieux qu un commentaire? Hypothèse : vous avez des TP en Java à faire et des sources à compléter (ce n est qu une hypothèse) Une annotation @ACompléter est_elle la bienvenue? @ADiscuter @ACompléter public class Liste{ @ACompléter private int xxxxx; @ACompléter public Liste(@ACompléter("xxxx est à remplacer") int xxxx ){ @ACompléter({"attention à la division par zéro"," et à la division entière") public int div(int x, int y){ return 1; 27

@ACompléter import java.lang.annotation.documented; import java.lang.annotation.target; import java.lang.annotation.retention; import java.lang.annotation.retentionpolicy; import java.lang.annotation.elementtype; import static java.lang.annotation.elementtype.*; /** ACompléter pour les TP.. * */ @Documented @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE) @Retention(RetentionPolicy.SOURCE) public @interface ACompléter{ /** éventuellement avec un message... */ String[] value() default {""; 28

Exemple 1) «RetentionPolicy.SOURCE» Une annotation destinée au compilateur Ou plutôt à une instance d AnnotationProcessor exécutée par le compilateur depuis 1.6 (en 1.5, voir l outil apt) Exemple génération d un script SQL Par exemple pour un Mapping Objet/relationnel c.f. JPA @DBTable(name = "CUSTOMERS") public class Customers {. Extrait en partie de http://www.jroller.com/trickymar/entry/how_to_create_files_with 29

@DBTable import java.lang.annotation.elementtype; import java.lang.annotation.retention; import java.lang.annotation.retentionpolicy; import java.lang.annotation.target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.SOURCE) public @interface DBTable { String name(); 30

DBTableProcessor @SupportedAnnotationTypes(value= {"DBTable") @SupportedSourceVersion(SourceVersion.RELEASE_6) public class DBTableProcessor extends AbstractProcessor{ @Override public boolean process(set<? extends TypeElement> annotations,roundenvironment roundenv){ Boolean result = Boolean.TRUE; Messager consolelogger = processingenv.getmessager(); try{ for (Element element : roundenv.getelementsannotatedwith(dbtable.class)){ Filer filer = processingenv.getfiler(); FileObject o = filer.createresource(standardlocation.source_output, "generated",element.getsimplename()+".sql"); Writer w = o.openwriter(); w.append("create TABLE "+element.getannotation(dbtable.class).name()); w.flush(); w.close(); consolelogger.printmessage(kind.note,"file finished"); catch (IOException ex){ consolelogger.printmessage(kind.error,ex.getmessage()); return result; 31

DBTableProcessor les import import java.io.ioexception; import java.io.writer; import java.util.set; import javax.annotation.processing.abstractprocessor; import javax.annotation.processing.filer; import javax.annotation.processing.messager; import javax.annotation.processing.roundenvironment; import javax.annotation.processing.supportedannotationtypes; import javax.annotation.processing.supportedsourceversion; import javax.lang.model.sourceversion; import javax.lang.model.element.element; import javax.lang.model.element.typeelement; import javax.tools.fileobject; import javax.tools.standardlocation; import javax.tools.diagnostic.kind; 32

Le fichier./generated/customers.sql javac -processor DBTableProcessor Customers.java Le fichier./generated/customers.sql CREATE TABLE CUSTOMERS Discussion Nouveau langage? Annotations absconses? Trop puissantes? Indispensables aux développeurs? 33

Exemple 2) Usage de Pré-Post assertion Présence d annotation au «run-time» Ici des contrats sur les constructeurs d une Table public class Table implements TableI{ public final static int TAILLE_PAR_DEFAUT = 10; private int[] table; @Pre("taille > 0 ") @Post("table!= null && table.length==taille") public Table(int taille){ table = new int[taille]; @Post("table!= null && table.length==taille_par_defaut") public Table(){ this(taille_par_defaut); 34

@Pre, @Post «RetentionPolicy.RUNTIME» import java.lang.annotation.elementtype; import java.lang.annotation.target; import java.lang.annotation.retention; import java.lang.annotation.retentionpolicy; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.CONSTRUCTOR) public @interface Pre { String value(); @Post (idem) 35

Introspection : accès au Annotations public void testannotationdesconstructeurs() throws Exception{ for(constructor<?> cons : Table.class.getDeclaredConstructors()){ for(annotation a : cons.getannotations()){ System.out.println(a); System.out.println(cons.getName()+ "/" + cons.getparametertypes().length); 36

Annotations et plus Ce sont des String -> Instrumentation du bytecode, compilation à la volée, DynamicProxy Usage de BCEL instrumentation du byte code compilation à la volée Usage d un agent voir la solution choisie par jass-modern Java agent 37

@xxxxxdetypage Google juice Précision sur les paramètres à injecter : @Inject constructeur(@service ServiceI service){ this.service = service; Dans l Injecteur bind(servicei.class).annotatedwith(service.class).to(listeencsv.class); L annotation @Service décrite comme suit (fichier Service.java) @Retention(RetentionPolicy.RUNTIME) @Target( {ElementType.PARAMETER ) @BindingAnnotation // annotation d annotation public @interface Service{ 38

En savoir plus MVC + annotations http://www.javaworld.com/javaworld/jw-10-2005/jw-1003-mvc_p.html JUnit4 http://www-128.ibm.com/developerworks/java/library/j-junit4.html Modern Jass http://modernjass.sourceforge.net/ Google Juice http://code.google.com/p/google-guice/ 39

Conclusion? Trouvée sur le web Java annotations are a welcome unification and standardization of approaches to annotating code that language designers and implementors have been doing for decades Annotations do not directly affect the semantics of a program It is not hard to learn! Discussion Sur ce qui est au dessus Fonctionnalités dans le «dos» du programmeur? Annotations absconses sont-elles possibles? Vers une meilleure productivité au détriment de la compréhension? Mais avons besoin de comprendre pour être plus productif Appels d un framework Un autre langage au dessus de Java? c.f. JPA, Mapping Objet/Relationnel 40