Programmation JAVA Sun service formation
La machine virtuelle
Que ce soit pour un navigateur ou pour une application autonome il y a un exécuteur de code Java.
Ce programme interprète le code binaire Java comme un code d’une machine virtuelle. Les spécifications du langage Java définissent très précisément la description et le comportement de cette machine virtuelle (c’est une “machine” à pile).
Le code “binaire” Java est en fait un pseudo-code (bytecode) portable: seules les implantations de la JVM (Java Virtual Machine) diffèrent selon les plate-formes.
Pour exécuter un code Java sur un Système et une architecture donnée on doit donc trouver localement:
• Une implantation de la JVM (au sein d’un navigateur, ou pour lancer des applications autonomes)
• Les librairies constituant le noyau des classes standard Java. La plus grande partie est constituée de code Java (une partie est du code binaire spécifique à la plate-forme locale).
La Java Virtual Machine Specification définit entre autres:
• Le jeu d’instruction du pseudo-code
• La structure des registres et l’organisation de pile
• L’organisation du tas et de la mémoire (recupération automatique par garbage-collector)
• Le format des fichiers .class
Différents modes d’exécution
152 invokestatic #66 <Method java.lang.String valueOf(char)>
155 astore_3
156 goto 203
159 aload_0
160 getfield #56 <Field char lastOp>
163 bipush 61
165 if_icmpne 194
168 aload_0
169 aconst_null
170 putfield #58 <Field java.math.BigDecimal result>
173 aload_0
174 bipush 43
176 putfield #56 <Field char lastOp>
179 aload_0
180 getfield #49 <Field java.awt.TextField answer>
183 aload_0
184 ldc #1 <String « »>
186 dup_x1
187 putfield #53 <Field java.lang.String curString>
190 invokevirtual #62 <Method void setText(java.lang.String)>
193 return
194 iconst_1
195 istore 4
197 ldc #1 <String « »>
199 astore_3
200 goto 203
203 aload_3
INTERPRETE
lit, exécute
lit, exécute
COMPILATEUR
A LA VOLEE (JIT)
compile le fichier
en codes natifs
et les exécute
codes natifs
en mémoire
HOTSPOT
interprétation compilation
en back-up optimisée
Les différents modes d’exécution
• Interprétation: Le programme qui implante le comportement de la JVM, lit le fichier de bytecode et exécute les opérations au fur et à mesure. C’est un interprête d’un code de bas niveau.
Les interprêtes font des progrès constants en performance depuis les premières versions de Java.
• JIT (Just-In-Time, compilation à la volée): Le programme chargé d’exécuter le code Java, compile directement ce pseudo-code en code natif de la plateforme locale, puis l’exécute. On fait le pari que le temps perdu par la compilation sera rattrapé du fait de la rapidité d’exécution du code natif.
• HotSpot : stratégies d’optimisation très complexes. L’optimiseur décide, au moment de l’exécution, s’il y a lieu de compiler ou d’interpréter (ex. boucle exécutée N fois : la situation n’est pas la même si N vaut 2 ou vaut des milliers). Par ailleurs ne cherche pas à compiler des cas rares et difficiles à compiler, fait de l’expansion de code (inlining), etc.
Sécurité : chargeur , vérificateur, gestionnaire de sécurité
Le chargement de code au travers du réseau pose un certain nombre de problêmes de sécurité :
• Quelle est le code Java que j’exécute? Est-il possible de m’adresser au travers du réseau un code (inamical?) qui remplace un de mes codes Java locaux?
Le chargement de code au travers du réseau est de la responsabilité d’un ClassLoader (une classe Java).
Un ClassLoader cherchera toujours à charger une classe dans les ressources système avant de s’adresser à d’autres ressources.
• Le code compilé téléchargé peut-il être corrompu et donc faire faire à la JVM locale des opérations illégales?
Le vérificateur de ByteCode contrôle la conformité du code chargé (validité des opérations, validité des types, contrôles d’accès,…).
• Le code importé peut-il réaliser localement des opérations que je ne souhaite pas (obtention d’une information confidentielle, écriture dans le système de fichiers local, etc..)?
Un SecurityManager fait respecter une politique de sécurité.
Un objet AccessControler (une classe Java) est chargé de contrôler tous les accès critiques et de faire respecter une politique de sécurité
Ainsi, par défaut, le code d’une Applet ne pourra pas connaître des informations critiques sur le site local (système de fichiers login, etc.), ne pourra pas écrire dans le fichiers locaux, déclencher des applications locales ou atteindre des sites sur le réseau autre que le site qui a distribué l’Applet elle-même.
Des ressources locales permettent de définir des droits particuliers accordés à des intervenants dûment accrédités:
grant codebase “http://www.montaigne.fr/”, signedBy “laBoetie”{ permission java.io.FilePermission « /tmp/* », « read,write »; };
Présentation de Java
Applications, Applets, …: à la découverte de Java
Le langage de programmation Java
Code source, code exécutable
Portabilité : la machine virtuelle
Différents modes d’exécution
Sécurité : chargeur , vérificateur, gestionnaire de sécurité
Robustesse: contrôles à la compilation et au run-time
Robustesse : récupération des erreurs, gestion de la mémoire,
Une application Java simple
Introduction à la modularité: classes et packages
Architecture générale d’un fichier source
Utiliser la documentation
Syntaxe, identificateurs, mots-clefs, types
Syntaxe : généralités
Commentaires
Séparateurs
Identificateurs
Mots-clés
Types scalaires primitifs, types objets
Types primitifs : logiques
Types primitifs: texte
Types primitifs: numériques entiers
Types primitifs: numériques flottants
Objets: agrégats
Objets: allocation
Objets: introduction à la terminologie
Tableaux: initialisations
Tableaux multidimensionnels
Limites de tableau
récapitulation: déclarations de variables
Conventions de codage
Syntaxe: expressions et structures de contrôle
Notions de méthode: principes, paramètres, résultats
Opérateurs
Opérations logiques “bit-à-bit” sur booléens
Evaluation des opérations logiques
Concaténation
Décalage à droite avec >> et >>>
Conversions, promotions et forçages de type
Structures de contrôle: branchements
Structures de contrôle: boucles
Structures de contrôle: débranchements
Portée des variables, cycle de vie
Objets et classes
Classes et objets
Méthodes d’instance
Encapsulation
Initialisations : constructeur
Construction de l’instance : compléments
Instances : la référence this
Récapitulation: architecture d’une déclaration de classe
Composition d’objets, héritage
Imbrications d’instances : agrégation, association
Relation “est un”
Héritage: mot-clef extends
Spécialisation des méthodes
Polymorphisme
Opérateur instanceof
Forçage de type pour des références
Héritage: on hérite des membres pas des constructeurs
Mot-clef super pour l’invocation d’un constructeur
Spécialisations courantes: toString, equals, clone
Modularité, modificateurs
packages
Organisation pratique des répertoires
Déclaration de visibilité (import)
Contrôles d’accès
Modificateurs final
Modificateur static (rappel)
Les exceptions
Le traitement des erreurs
Le mécanisme des exceptions Java
Exemple de récupération d’exception
Hiérarchie, exceptions courantes
Définir une nouvelle exception
Déclencher une exception
Blocs try-catch
Bloc finally
Récapitulation: modèle des méthodes
Introduction aux entrées/sorties
Entrées/Sorties portables, notion de flot (stream)
Flots d’octets (InputStream, OutputStream)
Flots de caractères (Reader, Writer)
Typologie par “ressources”
Conversions octets-caractères
Filtres
Filtres courants
Les applets
Applets
Applets: restrictions de sécurité
Hiérarchie de la classe Applet
Applets: groupes de méthodes
H.T.M.L.: la balise Applet
Méthodes du système graphique de bas niveau
Méthodes d’accès aux ressources de l’environnement
Méthodes du cycle de vie
I.H.M. portables : AWT
Le package AWT
Composants et Containers
Taille et position des composants: les gestionnaires de disposition
FlowLayout
BorderLayout
GridLayout
Combinaisons complexes
Autres gestionnaires de disposition
Interfaces et classes abstraites
Types abstraits
Déclarations d’interface
Réalisations d’une interface
Conception avec des interfaces
Les classes abstraites
Le modèle d’événements AWT
Les événements
Modèle d’événements
Catégories d’événements
Tableau des interfaces de veille
Evénements générés par les composants AWT
Détails sur les mécanismes
Adaptateurs d’événements
Classes membres, classes locales
Introduction: un problème d’organisation
Introduction: organisation avec une classe locale
Classes et interfaces membres statiques
Classes membres d’instance
Classes dans un bloc
Classes anonymes
Récapitulation: architecture d’une déclaration de classe
Annexe: Packages fondamentaux
java.lang
java.util
Internationalisation (i18n)
Numeriques divers
Interactions graphiques portables : AWT, SWING
Entrées/sorties
java.net
R.M.I
J.D.B.C
Beans
Annexe