• Aucun résultat trouvé

IJA - TD 2

N/A
N/A
Protected

Academic year: 2022

Partager "IJA - TD 2"

Copied!
24
0
0

Texte intégral

(1)

IJA - TD 2

Historique de Java

Ce qu’est Java, architecture, machine virtuelle Caractéristiques du langage et principe de base

Le mot-clé static

Ant et le packaging d’applications

(2)

Java ?

• Printemps 90 : Naughton, Gosling et Sheridan :

– "Le consommateur est le centre du projet, il faut construire un environnement de petite taille avec une petite équipe et intégrer cet environnement dans une nouvelle génération de machines : des ordinateurs simples pour des gens normaux."

• Printemps 91 : Microprocesseur grand public.

– La "Green Team" prototype une machine de pilotage de l'électroménager

• Août 91 : Gosling développe Oak

(3)

Java ?

• Eté 1993 : Sté. "First Person" est en train de couler

– Eric Schmidt ( Sun) demande une adaptation au Net

• Gosling : travaille sur le code et ajoute les packages java.net

• Naughton : cherche une application stratégique ==> hotjava

• Janvier 1995

– Oak ==> Java, HotJava

• Août 1995 - Première licence sur Netscape

• Janvier 1996 - JDK 1.0.1

• Fév. 97 - JDK 1.1

• Jan 99 - JDK 2.0 (aka 1.2)

• 2003 J2se 1.4, J2ee, J2me (Standard, Entreprise, Micro) : 92Mo, 9200 classes,

• 2004 J2se 1.5, 230Mo, 13295 classes

• J2SDK, J2RE, J2EE

(4)

Java, ce que c’est !

• Une architecture technique

• Un langage OO

• Une bibliothèque de 5000 éléments

(5)

Plateforme Java : architecture

J D K 1 . 1

J A V A B e a n s

S e r v e u r s

A P I d e

S é c u r i t é R M I J D B C J N I I n t e r n a t i o n a

l i s a t i o n

J a v a C o r e R e f l e c t i o n J N D I S e r v e r

A P I J a v a I D L M a c h i n e V i r u e l l e J a v a O S + E m b e d d e d A P I +

P e r s o n a l A P I

P C s N C P D A P u c e s J a v a

H o r i z o n t a l e

C o u c h e s y s t è m e

P l a t e s - f o r m e s c i b l e s M e d i a

A P I

C o m m e r c e

A P I M a n a g e m e n t A P I T r a n s a c t i o n

S e r v i c e s A u t r e s A P I V e r t i c a l e

J D K 1 . 0

Java Client/Serveur : Nicolas, Avare, Najman - Eyrolles

(6)

Machine Virtuelle : Emulateur

• Byte-Code/P-Code/J-Code

– opcode : 1 octet pour l'instruction – 0,n opérandes

• MicroProcesseur logiciel

– Jeu d'instructions

– Registres (pc, optop, frame, vars) – Pile, Heap

– Ramasse-miettes

– Espace de stockage des méthodes – Tas de constantes

• ==> Compilé ou Interprété

Compilateur javac Byte-Code .class

MV Interpréteur

SE Matériel Source

.java

(7)

Caractéristiques du langage

• Portable --> Bytecode

• Sécurisé --> chargement sécurisé

• Auto-documenté --> javadoc

• Graphique --> swing, awt

• Distribué --> net

• Semi-reflexif --> forName

• Multi-thread --> thread

(8)

“l’œuf ou la poule?”

• Chaque objet provient d'une classe dont on fabrique une instance

Object o1=new Object();

• Mais comme “tout est objet”, comment fait- on pour avoir le premier objet ?

– Soit il existe un premier objet fourni au

démarrage de la machine virtuelle au démarrage – Soit il existe des objets toujours disponibles

– ...

(9)

La classe vue comme un objet

• Toutes les classes instanciées sont connues de la machine virtuelle. Elles pourraient donc être également utilisées comme des objets.

...

Hello h2=new Hello();

Res r=h2.coucou();

...

Hello

new

coucou

class Hello{

public void coucou(){}

}

Comment écrire une méthode coucou dans la classe hello,

mais dont le destinataire ne soit pas une des instances, mais la classe ?

h2

(10)

...

Hello h2=new Hello();

h2.coucou();

Hello.coucou();

...

Hello

+static coucou() +coucou()

public class Hello{

public void coucou(){...}

Le mot clé static

• On ajoute un mot-clé à la signature des méthodes

public void coucou(){ ... } /*Cette méthode est connue des instances- objets*/

public static coucou(){...} /*Cette méthode est connue de la classe */

• Comment l'objet h2 fait-il pour invoquer une méthode statique sur la classe Hello?

– Soit on change d'opérateur : h2*coucou() ==> Indique qu'on invoque la méthode statique (mais c’est pas comme ça qu’on fait)

– Soit on adapte le destinataire du message : Hello.coucou() ==> Indique que coucou

est relatif à la classe et non pas à une de ses instances

(11)

Exercice

• Ecrire le code d'une classe Client, utilisant une classe DivisionO réalisée en utilisant des méthodes d'objets

– Compiler

• Ecrire une classe DivisionO en objet – Compiler, Lancer

• Modifier le code de la classe Client pour utiliser une classe DivisionS qui présente des méthodes statiques

– Compiler

• Ecrire une classe DivisionS en statique

– Compiler

(12)

Conséquences directes

• La classe est également vue comme un objet

• Les attributs et les méthodes statiques sont associés à la classe et non à chaque objet

• Toutes les instances de la classe peuvent être vus comme partageant la valeur des attributs "static"

• Il n'est pas nécessaire d'instancier une classe pour accéder à ses éléments statiques

• La notion de static peut être perçue comme représentant les

(13)

Exemple du mot clé static

public class Circle {

public static int count = 0;

public static double PI = 3.14;

protected double x, y, r;

public Circle(double r){this.r = r; count++;}

... /*cf ppts précédents*/

public static Circle bigger(Circle c1, Circle c2){

if (c1.r > c2.r) return c1; else return c2;

} }

public class UneClasseExemple{

public UneClasseExemple(){

Circle c1 = new Circle(10);

Circle c2 = new Circle(20);

int n = Circle.count; // n = 2 Circle c4 = Circle.bigger(c1, c2); // c4 = c2 }

}

getArea() 2

3 10 getX()

getY() getR()

count 2

getArea()

getPerimeter() 4

5 1000 getX()

getY() getR()

bigger(Circle, Circle)

(14)

Enfin mon premier programme

public class HelloWorld {

public static void main(String [] arg){

System.out.println("Hello, World !");

} }

Static main(String [] arg) HelloWorld

HelloWorld.java

Compilateur

javac HelloWorld.java

HelloWorld.class

Machine Virtuelle

HelloWorld

(15)

Exercice

• Décrire en terme d'objets et de messages la commande d'affichage

  System.out.println("coucou");

• Lancer le programme de gestion des divisions.

– Quelles sont les différences entre approche statique et l'autre ?

– A quoi ressemble l'approche statique ?

• Réaliser une usine d'objets d’une classe Coucou

– La classe FabriqueCoucou, permet d'instancier les

objets de la classe Coucou. Réaliser le client, l'usine et

la classe.

(16)

Pourquoi ?

• Pourquoi ne pas tout faire en statique ?

– Parce qu'en programmation objet on manipule des objets qui sont beaucoup plus faciles à réorganiser

• Qu'est ce qui est statique ?

– Le main (on n'a pas le choix, il n'y a pas encore d'objet) – Les constantes :

public static final int ETAT_STABLE=1;

….

toto.setState(UneClasse.ETAT_STABLE);

– Les fonctions communes de service

• Dans ce cas on essaye de les regrouper dans une classe de service

– Les usines de fabrication pour masquer les constructeurs

(17)

Le packaging d'applications

Le retour du makefile...

(18)

Objectifs du Makefile

• Gérer une chaîne complète de production de logiciels (et plus si affinité) – Ex :

• Compilation

• Génération de squelettes

• Intégration de code

• Tests

• Packaging

• Mailing

• Déploiement...

– ==> Le pb : chaque tâche ci-dessus repose sur des outils spécifiques. Il faut des outils pour mettre bout à bout l'exécution de ces outils

• Pour réaliser l'ensemble de ces tâches, il existe deux solutions : – Les langages de scripts

– Les outils de gestion de projet comme Makefile ou Ant

(19)

Objectifs du Makefile

• Les objectifs du makefile sont de gérer proprement un ensemble de tâches. Ex en C :

– compilation, linkage, exécution

run: test ./test test: test.o

gcc -o test.o test.c test.o: test.c

gcc -c test.c

• Les tâches déjà réalisées ne sont pas ré-exécutées, seuls les fichiers à regénérer le sont.

– ant est une adaptation de make au monde java, et

aux projets plus « complexes »

(20)

Ant

• Repose sur un fichier de description de tâches : build.xml

• La commande est ant

• Il existe toute une collection de tâches standardisées

– java, javac, mail, cc, jar, tar, move, copy, documentation...

• Il est possible de définir de nouvelles tâches

• http://ant.apache.org

(21)

Ant exemple

<project name="jmxosgi" default="run" basedir=".">

  <property name="src" value="src"/>

  <property name="classes" value="classes"/>

  <property name="doc.dir" value="doc"/>

  <path id="classpath">

    <pathelement location="lib/osgi.jar"/>

  </path>

  <target name="clean">

    <delete verbose="false"

      includeEmptyDirs="true">

      <fileset dir="${classes}"/>

    </delete>

  </target>

  <target name="init">

    <mkdir dir="${classes}"/>

  </target>

  <target name="compile" depends="init">

    <javac srcdir="${src}"

       destdir="${classes}"

       debug="on">

       <classpath refid="classpath"/>

    </javac>

  </target>

  <target name="run" depends="compile">

    <java classname="Test">

<classpath refid="${classpath}"/>

    </java>

  </target>

</project>

Les commandes possibles : ant

ant init ant clean ant compile ant run

(22)

Organisation d’un projet en Java

• Un projet java est structuré en :

totor/ ==> indique le nom du projet

src/ ==> contient les sources java à compiler avec la structure en package (voir plus tard...)

classes/ ==> contient les classes compilées

doc/ ==> contient la documentation du projet lib/ ==> contient les librairies externes au

projet

build.xml ==> Les directives de génération

• On peut également retrouver :

– Un fichier de licence

(23)

Les cibles ant

• Tout projet java doit au moins contenir les cibles principales suivantes:

clean  ==> Nettoie tous les fichiers générés par la  chaîne

dist   ==> Fabrique une archive propre  distribution du projet

<default> ==> La cible par défaut fabrique de quoi  lancer le projet. 

• Exemple de cible dist :

<target name="dist" depends="clean">

<jar jarfile="${release}" basedir=".." excludes="CVS">

<include name="jmxosgi/lib/**"/>

<include name="jmxosgi/${src}/**"/>

</jar>

</target>

(24)

Exercice

• Réaliser votre projet Division sous ant.

• Votre outil doit vous permettre de :

– compiler, lancer et packager votre projet

• A partir de maintenant tous vos projets de développement sont packagés dans des

scripts ant...

Références

Documents relatifs

Comme l’an dernier, vous serez invités à nous faire découvrir votre coup de cœur : surveillez notre coupon et plus d’informations dans le prochain numéro de l’Info de

Nous pensons qu’il doit être facile de tester des coqs Marans avec des poules Rhode Island rouge avant la saison de reproduc- tion, les coqs gardés devant avoir

– Saisir le code de la classe Circle, comme donné dans la diapo 5 (c’est-à-dire sans constructeur), compiler (et deboguer of course!). – Ecrire une classe TestCircle qui

– ajouter un attribut private qui compte le nombre d’éléments dans le tableau et passez l’attribut tableau public (c’est interdit mais c’est pour la bonne cause). –

– soit être situé dans une méthode propageant ( throws ) cette classe d'exception. • Un bloc finally peut-être posé à la suite des

filles, soit des attributs et méthodes types qui doivent être (re)définie dans dans les classes filles.. public class Cercle extends

• Implanter une autre version « threadée » de cet algorithme de tri en les synchronisant avec les méthodes wait et notify.. Les applets

La forêt est bien évidemment le lieu de tous les mystères et de tous les fantasmes pour les enfants: difficile de traverser son enfance sans éviter le petit chaperon rouge,