http://www.ed-diamond.com

Documents pareils
Remote Method Invocation Les classes implémentant Serializable

as Architecture des Systèmes d Information

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

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

RN2-Programmation Orientée Objet - JAVA CH 1 Introduction à la POO et Java

Vulgarisation Java EE Java EE, c est quoi?

Auto-évaluation Programmation en Java

Remote Method Invocation (RMI)

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

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

TP1 : Initiation à Java et Eclipse

Calcul Parallèle. Cours 5 - JAVA RMI

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Chapitre I Notions de base et outils de travail

RMI le langage Java XII-1 JMF

Java - la plateforme

Java DataBaseConnectivity

Programmer en JAVA. par Tama

Initiation à JAVA et à la programmation objet.

SQL Server Installation Center et SQL Server Management Studio

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 )

PROGRAMMATION PAR OBJETS

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

Threads. Threads. USTL routier 1

INITIATION AU LANGAGE JAVA

Java Licence Professionnelle CISII,

Traitement de données

TP1. Outils Java Eléments de correction

Java Licence Professionnelle CISII,

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Remote Method Invocation en Java (RMI)

Cours 1: Java et les objets

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

Mise en œuvre des serveurs d application

La base de données XML exist. A. Belaïd

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

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

Premiers Pas en Programmation Objet : les Classes et les Objets

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Java 1.5 : principales nouveautés

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

Intergiciel - concepts de base

Création d une application JEE

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

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Synchro et Threads Java TM

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Une introduction à Java

Construire des plug-ins pour SAS Management Console SAS 9.1

Alfstore workflow framework Spécification technique

Machines Virtuelles. et bazard autour. Rémi Forax

Un ordonnanceur stupide

Tutoriel d installation de Hibernate avec Eclipse

Gestion distribuée (par sockets) de banque en Java

Langage Java. Classe de première SI

Introduction : les processus. Introduction : les threads. Plan

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

Java c est quoi? Java pourquoi?

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)

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

Chapitre 10. Les interfaces Comparable et Comparator 1

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

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

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

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

Projet gestion d'objets dupliqués

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

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Introduction à ORACLE WAREHOUSE BUILDER Cédric du Mouza

Module.NET 3 Les Assemblys.NET

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

Programmation Objet Java Correction

Utiliser Java sans BlueJ

LES NOUVEAUTES DE COST AND PROFITABILITY MANAGEMENT 8.1

Paginer les données côté serveur, mettre en cache côté client

Package Java.util Classe générique

Présentation de Java. Olivier de Pertat IT GROUP

Oracle Developer Suite 10g. Guide de l installation. Vista & Seven

Programmation Par Objets

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

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Développement Logiciel

Compte Rendu d intégration d application

OpenPaaS Le réseau social d'entreprise

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Conception de serveurs d'applications ouverts

Étude de l interopérabilité de deux langages de programmation basée sur la machine virtuelle de Java

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

La JVM. La machine virtuelle Java. La JVM. La JVM

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

Java Licence professionnelle CISII,

TD3: tableaux avancées, première classe et chaînes

Architecture Orientée Service, JSON et API REST

2 Chapitre 1 Introduction

TP1 : Initiation à Java et Eclipse

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

Chapitre VI- La validation de la composition.

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

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

Transcription:

Ceci est un extrait électronique d'une publication de Diamond Editions : http://www.ed-diamond.com Ce fichier ne peut être distribué que sur le CDROM offert accompagnant le numéro 100 de GNU/Linux Magazine France. La reproduction totale ou partielle des articles publiés dans Linux Magazine France et présents sur ce CDROM est interdite sans accord écrit de la société Diamond Editions. Retrouvez sur le site tous les anciens numéros en vente par correspondance ainsi que les tarifs d'abonnement. Pour vous tenir au courant de l'actualité du magazine, visitez : http://www.gnulinuxmag.com Ainsi que : http://www.linux-pratique.com et http://www.miscmag.com

News Par :: Jean-Baptiste Onofré Les nouveautés de Java 1.5 Tiger 12 Depuis ses débuts, le langage Java n a cessé d évoluer et introduit beaucoup de nouvelles fonctionnalités surtout du côté serveur avec J2EE. Aujourd hui, c est une évolution majeure qui voit le jour avec la sortie de la nouvelle version du langage : Java 1.5, nom de code «Tiger». Cette nouvelle version rassemble des API développées précédemment en dehors du JDK et introduit des nouvelles notations et techniques de programmation. Faisons ensemble un tour d horizon des nouveautés de cette nouvelle version. Les motivations de Java 1.5 Les motivations de Java 1.5 peuvent se résumer en quatre points : Facilité de développement. Performance et évolutivité. Monitoring et manageabilité. Client desktop. Le JCP (Java Community Process) a établi une liste de 15 spécifications JSR regroupant plus de 100 changements majeurs dans le langage. On remarque bien l importance de cette nouvelle version à la fois dans ses fonctionnalités pour le développeur mais aussi pour l utilisateur final. Nouveautés du langage pour faciliter le développement Nous allons voir ici les nouveautés du langage qui facilitent la vie du développeur. Ces nouveautés sont : Les types génériques. Les metadatas. L autoboxing. La nouvelle notation des iterators (loop). Les types énumérés. Les imports statiques. Le format d écriture des entrées/ sorties «à la C». Les arguments variables. Les utilitaires de concurrence. La génération d interface RMI simplifiée. Ces changements sont regroupés dans trois spécifications JSR : JSR-201 regroupe la nouvelle notation des iterators, les types énumérés, les imports statiques et l autoboxing. JSR-175 présente les spécifications des metadatas. JSR-14 décrit les types génériques. Commençons la description de chaque nouveauté. Metadatas La fonctionnalité metadata permet d associer des données additionnelles à des classes, des interfaces, des méthodes ou des attributs Java. Ces données additionnelles, appelées "annotations", peuvent être lues par le compilateur Javac (ou d autres outils) et peuvent être stockées dans le fichier class et être appelées à l exécution grâce à l API de réflexion Java. Grâce aux metadatas, la plate-forme Java permet à des outils tiers d utiliser la même infrastructure commune et donc de réduire les efforts pour le développement et le déploiement. Un outil peut utiliser les metadatas pour générer du code source supplémentaire ou pour fournir des informations de débuggage par exemple. C est une forme de Attribute Oriented Programmation comme le fait XDoclet sur les tags JavaDocs. D ailleurs Java 1.5 fournit un processeur d annotation appelé «apt». Apt inclut un ensemble de nouvelles API de réflexion et supporte l infrastructure pour gérer les annotations. Grâce aux metadatas (et apt), de nombreuses étapes de répétition de code peuvent être remplacées par des tags. Par exemple, l interface Remote nécessaire lorsque vous accédez à un service JAX-RPC peut être générée avec les metadatas : public class Ping { public @remote void ping() { Alors qu en Java 1.4, on aurait dû déclarer notre interface explicitement :

Les nouveautés de Java 1.5 Tiger public interface PingI extends Remote { public void ping() throws RemoteException; public class Ping implements PingI { public void ping() { Types génériques Les types génériques sont tout particulièrement utiles dans les collections. L API Collection fournit différents types de listes comme les LinkedList, les ArrayList ou les HashMap qui peuvent être utilisées pour stocker différents types d objets. Par exemple, avec Java 1.4, pour créer une liste et stocker un objet à l intérieur, il faut faire : ArrayList list = new ArrayList(); int total = ((Integer)list.get(0)).intValue(); Le cast de la dernière ligne est un cast de type qui va pouvoir être évité avec les types génériques. Le problème vient du fait que l API Collection de Java 1.4 utilise la classe «object» pour le stockage de la Collection, ce qui signifie que le type ne peut pas être déterminé au moment de la compilation. Si par exemple, vous attendez un objet de type Integer, vous allez caster avec (Integer), mais si l objet inséré n est pas de type Integer (ce qui est tout à fait possible puisque tous les objets en Java héritent de la classe object), vous aurez une ClassCastException à l exécution. Désormais avec les types génériques, vous n avez plus besoin de caster et vous êtes sûrs que votre liste contient bien que des objets du type que vous attendez : int total = list.get(0).intvalue(); Le développeur a juste à préciser le type avec la notation <>. Les casts de type ne sont plus nécessaires et désormais, si par exemple vous essayez d insérer un objet String dans cette liste, l erreur sera détectée au moment de la compilation (et pas à l exécution). Vous pouvez également définir vos propres API utilisant les types génériques. Pour cela, le mieux est de commencer par jeter un oeil à l implémentation de java. util.collection. Autoboxing et auto-unboxing des types primitifs La conversion entre types primitifs (comme int, boolean, etc. et leur équivalent object comme Integer, Boolean, etc.) peut nécessiter du code supplémentaire tout spécialement dans un contexte de Collection. L autoboxing et l auto-unboxing des types primitifs permet de réduire significativement la quantité de code à écrire pour les conversions. Typiquement, voilà le code qu il fallait fournir pour la conversion de Integer vers int : int total = (list.get(0)).intvalue(); On remarque que pour l ajout dans la liste, on doit explicitement créer l objet avec new Integer et que pour la récupération de la valeur, on fait appel à intvalue pour revenir au type int. Grâce à l autoboxing, ces manipulations sont faites automatiquement : list.add(0, 42); int total = list.get(0); Les new Integer et intvalue ont disparu :). Nouveau iterator La classe Iterator est très utilisée dans l API Collection. Elle fournit un mécanisme pour itérer dans une collection. La nouvelle notation remplace l itérateur quand vous voulez simplement traverser une collection. Le compilateur génère un code d itération nécessaire ainsi que les casts nécessaires. Avec Iterator de Java 1.4, on fait : for(iterator i = list.iterator(); i.hasnext();) { Integer value = (Integer)i.next(); A présent, on a une nouvelle notation pour itérer : for(integer i:list) {... Types énumérés Un nouveau type voit le jour : enum. Il vous permet de stocker une énumération de constantes (statiques et finales) : public enum FeuDeSignalisation { rouge, orange, vert ; Import statique L import statique vous permet de référencer une constante statique d une classe sans avoir besoin d hériter de la classe. Par exemple, à la place de faire BorderLayout.CENTER chaque fois que vous ajoutez un component, vous pouvez directement faire CENTER : import static java.awt.borderlayout.*; getcontentpane().add(new JPanel(), CENTER); Sorties formatées A présent, les développeurs peuvent utiliser les sorties formatées comme avec la fonction printf du langage C. La majorité des formatés du langage C est présente, plus quelques spécifiques à Java notamment pour les Dates et les BigInteger. Vous pouvez vous référer à la classe java.util.formatter. Le caractère Unix \n est bien sûr accepté mais pour des raisons de portabilité, il est recommandé d utiliser le standard Java %n. System.out.printf( Newline %n ); System.out.printf( %s %5d%n,user,total); Entrées formatées Comme nous avons les sorties formatées «à la C», nous avons l équivalent côté entrées. Java 1.5 fournit une API Scanner qui permet de lire des données à partir de la console ou de n importe quel flux d entrée. Les méthodes next et nextint sont bloquantes si aucune donnée n est récupérée : Scanner s = new Scanner(System.in); String param = s.next(); int value = s.nextint(); s.close(); Arguments variables Les arguments variables sont une fonctionnalité permettant de passer des arguments multiples comme paramètre de méthodes. Il suffit d utiliser la notation... pour que la méthode accepte une liste d arguments et utilise un nombre aléatoire d arguments. Ainsi, il n est plus nécessaire de fixer le nombre d arguments : void argumentreader(object... args) { for(int i = 0; i < args.length; i++) { System.out.println(args[i].toString()); argumentreader( Hello, World ); Utilitaires de gestion de concurrence Le développement de l API de gestion de concurrence a débuté avant le Roadmap de Java 1.5. 13

News 14 En effet, cette API est décrite dans la spécification JSR-166 dirigée par Doug Lea. Elle a donc été tout naturellement incluse dans la Java 1.5. Cette API permet une abstraction du modèle de thread Java incluant les executors, un framework de thread task, des files d attente de threads, les timers, les locks (atomiques ou pas) et des primitives de synchronisation. Ainsi la programmation de sémaphores est facilitée. Par exemple, désormais il est possible de faire un wait sur un sémaphore permettant de contrôler l accès à un bloc de code. Les sémaphores sont plus souples et peuvent permettre l accès à plusieurs threads concurrents (bien sûr, il faut que vous testiez le lock avant de l acquérir dans vos threads, ça ne se fait pas encore tout seul :)). Je vous invite à regarder le package java.util.concurrent pour plus d informations : final private Semaphore s = new Semaphore(1, true); int balanceaccount = 1000; s.acquireuninterruptibility(); // si vous ne voulez pas de bloquage, vous pouvez utiliser s.acquire() à la place. Ici, tant qu on obtient pas le lock, on attend. try { // on rentre en section critique, ce block est locké // et donc protégé balanceaccount = balanceaccount + 10; finally { s.release(); // on rend le lock disponible Il était une fois RMIC Lorsque vous faites de la programmation RMI (Remote Method Invocation), vous avez le mécanisme que j avais expliqué dans l article «Jboss»[1] : génération du stub côté client qui est un proxy embarquant les fonctionnalités réseau, transfert réseau, skeleton côté serveur qui est la même chose que le stub mais côté serveur. Dans un contexte J2EE, c est le serveur d application qui s occupe de la génération des stubs et des skeletons. Mais lorsque vous faites du RMI hors contexte J2EE, il vous faut générer le stub de votre côté (le côté client). Pour cela, vous deviez faire appel à RMIC qui était un outil de compilation RMI. Désormais, avec l utilisation des proxies dynamiques, vous n avez plus besoin de RMIC : les informations fournies dans le stub peuvent désormais être découvertes à l exécution. Performances, évolutivité et management Amélioration des performances On reproche souvent à Java sa lenteur et sa consommation ressource (même si les choses se sont beaucoup améliorées depuis Java 1.2). Java 1.5 s est fixé des objectifs de performance sans équivalent et notamment au lancement. Une nouveauté intéressante est l introduction du partage des données de classe entre JVM. Cette technologie permet à plusieurs JVM de partager les mêmes données read-only, mais aussi de permettre un démarrage plus rapide en permettant le pre-packaging des classes bas niveau de la JVM. Ainsi les nouvelles JVM créées utilisent des données déjà chargées en mémoire et sont donc plus rapides. De nouvelles options de paramétrage du heap Java voient également le jour dans Java 1.5. Désormais, deux nouveaux paramètres permettent de spécialiser le comportement de la JVM en fonction de l application : Le Maximum Pause Time Goal (option -XX:MaxGCPauseMillis=nnn) représente le temps d arrêt de l application lorsque le Garbage Collector est appelé. Si le Garbage Collector met plus de temps que le Maximum Pause Time Goal pour s exécuter, ce dernier est arrêté et l application reprend la main. Le Throughput Goal (option -XX: GCTimeRatio=nnn) mesure le temps occupé par le Garbage Collector par rapport au temps total. Ainsi, vous pouvez limiter le temps passé en Garbage Collection (le ratio est calculé par 1/(1 + nnn)). Ainsi, si vous précisez un ratio de 19 (- XX:GCTimeRatio=19), cela signifie qu au maximum, vous allez passer 5% du temps d exécution dans le Garbage Collector. Monitoring et management Je vous avais déjà présenté JMX (Java Management extension, spécification JSR-160) dans l article sur JBoss. JMX permet de monitorer et manager des périphériques ou applications JMX-compliants. Désormais, JMX est directement inclus dans la JVM ce qui vous permet de monitorer et de manager la JVM elle-même. Dans la plate-forme Java, le monitoring et le management sont un des points clef de ce qu on appelle RAS : Reliability, Availability, Serviceability. Désormais, vous disposez d une API dédiée au monitoring et au management. Vous pouvez donc monitorer/manager votre JVM directement dans du code ou en utilisant un adaptateur JMX (client distant ou console Web). Par exemple, nous pouvons démarrer une JVM avec le support d une console JMX sur un port donné : java -Dcom.sun.management.jmxremote.port=5001 -Dcom.sun. management.jmxremote.ssl=false -Dcom.sun.management.jmxremote. authenticate=false -jar Java2Demo.jar Une autre possibilité est de monitorer directement dans votre code. Voilà comment afficher l usage détaillé du heap de la JVM : import java.lang.management.*; import java.util.*; public class MemoryUsage { public static void main(string args[]) { List<MemoryPoolMXBean> pools = ManagementFactory. getmemorypoolmxbeans(); for(memorypoolmxbean p: pools) { System.out.println( Memory type = + p.gettype() + / Memory usage = + p.getusage()); Profiling Java 1.5 inclut une API de profiling appelée JVMTI. Cette API est spécifiée dans la JSR-163, l objectif initial était de refondre les interfaces de profiling. Au final, l API couvre beaucoup d autres choses comme le profiling, le debugging et des outils d analyse de code. L implémentation inclut un mécanisme d instrumentation du bytecode appelé JPLIS (Java Programming Language Instrumentation Services) qui permet à des outils d analyse d ajouter du profiling uniquement lorsque c est nécessaire. L avantage de cette technique est de se focaliser uniquement sur les analyses et de ne pas avoir d interférences d outils de profiling de la JVM. L instrumentation peut être générée à l exécution ou au chargement de classe. L exemple suivant crée une instrumentation qui peut charger une version modifiée d une classe à partir du disque. Pour lancer ce test, exécuter java -javaagent=mybci BCITest : [1] Jean-Baptiste Onofré, «Jboss» in Linux magazine 60.

Les nouveautés de Java 1.5 Tiger // fichier mybci.java import java.lang.instrument.instrumentation; public class mybci { private static Instrumentation copy; public static void premain(string options, Instrumentation instrumentation) { copy = instrumentation; public static Instrumentation getinstrumentation() { return copy; // fichier BCITest.java import java.nio.*; import java.io.*; import java.nio.channels.*; import java.lang.instrument.*; public class BCITest { public static void main(string args[]) { try { OriginalClass mc = new OriginalClass(); mc.message(); FileChannel fc = new FileInputStream(new File( modified +File.separator+ OriginalClass.class )). getchannel(); ByteBuffer buf = fc.map(filechannel.mapmode.real_only, 0, (int)fc.size()); byte[] classbuffer = new byte[buf.capacity()]; buf.get(classbuffer, 0, classbuffer.length); mybci.getinstrumentation().redefineclasses(new ClassDefinition[] { new ClassDefinition(mc.getClass(), classbuffer) ); mc.message(); catch(exception e) { // fichier OriginalClass.java // la version d origine est compilé dans le répertoire courant // Copier la source dans un répertoire modified, modifier le message et recompilez // la classe sera rechargé dynamiquement :) public class OriginalClass { public void message() { System.out.println( OriginalClass ); Par exemple, vous pouvez envoyer un mail lorsque la JVM s arrête ou lancer gdb (%p représente le processus ID ) : java -XX:OnError= mail -s JVMERROR jb@nanthrax.net ERROR java -XX:OnError= gdb %p Client desktop La première chose que l on remarque lorsqu on lance une application graphique avec Java 1.5, c est la rapidité de chargement. De nombreuses améliorations de performances ont été faites au niveau des API graphiques. Désormais, le toolkit Swing propose un nouveau thème appelé «Ocean» et supporte en natif les thèmes GTK et Windows XP. Sur Linux, Solaris et Windows, on dispose de l accélération OpenGL native (si la carte vidéo le supporte) en utilisant une propriété de lancement : java -Dsun.java2d.opengl=true -jar Java2D.jar Autre innovation de taille, désormais le toolkit AWT de Java (celui utilisé par défaut et par toutes les API graphiques) est basé sur X11 (et non plus Motif) et de plus, AWT supporte le protocole XDnD de X11, ce qui vous permet de faire du drag and drop avec d autres applications X11 comme OpenOffice ou Firefox. Au niveau JDBC, cinq nouvelles classes de RowSet ont été implémentées. Les deux plus intéressantes sont CachedRowSet et WebRowSet. Les objets de type RowSet, à l inverse des objets de type ResultSet, peuvent manipuler les données sans être obligatoirement connectés à la base de données (ou à une autre source de données). Ainsi, l utilisation des RowSet est moins gourmande en ressources puisqu on ne tient pas la connexion à la base. Ils sont donc plus performants que les «classiques» ResultSet. Un CachedRowSet stocke les collections de lignes en mémoire, et si nécessaire, il peut être synchronisé avec la base. D un autre côté, un WebRowSet stocke les collections de lignes au format XML. Voilà un exemple utilisant un WebRowSet : Class.forName( org.postgresql.driver ); WebRowSetImpl wrs = new WebRowSetImpl(); wrs.setcommand( select username from users ); wrs.setusername( postgres ); wrs.setpassword( postgres ); wrs.seturl( jdbc:postgresql://localhost/dbname ); wrs.execute(); // exécute la requête et stocke le résultat dans le RowSet wrs.absolute(1); // retourne le pointeur au début du RowSet wrs.writexml(system.out); // export le RowSet sous forme XML wrs.close(); 15 Amélioration des diagnostics Lorsqu une exception survenait, le code classique consistait à faire un affichage de la pile pour remonter à l origine de l erreur (avec la méthode getstacktrace()). Mais, lorsqu on ne met pas en place d API de logging et qu on a plus de console d ouverte, il est parfois difficile de récupérer ces traces. Java 1.5 a introduit deux nouvelles méthodes : getstacktrace et Thread.getAllStackTraces permettent de récupérer ces traces grâce à du code : StackTraceElement e[] = Thread.currentThread(). getstacktrace(); for(int i = 0; i < e.length; i++) { System.out.println(e[i]); System.out.println( \n +Thread.getAllStackTraces()); Désormais la JVM inclut un handler d erreur qui peut être lancé lorsque la JVM s arrête de manière non conforme (avec l option -XX:OnError=). Autres nouveautés Java 1.5 s est mis à la page concernant le support du XML avec notamment : Support de XML 1.1 avec les namespaces. Support des schémas XML. Support de SAX 2.0.2 et DOM level 3. Nouveau compilateur XSL plus performant. De nouveaux caractères ont été également ajoutés en vue du support de Unicode 4.0. Références http://www.java Sun.net. http://java.sun.com/j2se/1.5.0/download.jsp Conclusion Java 1.5 est une version majeure de Java. Il n y a pas vraiment de nouveaux concepts révolutionnaires mais beaucoup de nouveautés simplifiant la vie du développeur. De plus, les performances sont au rendezvous. Les développeurs ne s y sont pas trompés puisque, par exemple, JBoss 4 est développé avec Java 1.5 ainsi que Apache Geronimo 1.0M3.