Le point sur Java 7

Posté par  (site web personnel, Mastodon) . Modéré par baud123.
Étiquettes :
22
16
avr.
2010
Java
Pour les développeurs Java, les nouveautés que réserve Sun^WOracle pour les prochaines versions de son langage Orienté Objet sont autant de sujets d'attentes, de débats, et même pour certains ... d'espoirs ! Beaucoup a été dit et surtout bloggué depuis le lancement du projet Java 7 "Dolphin", les échanges ont été nombreux et le débat fourni. À l'heure où la sortie de cette dernière mouture de Java est imminente, faisons le point sur le sujet et tout particulièrement sur le projet Coin de Sun et des améliorations qu'il apporte à Java 7.

NdM : Merci à galaux pour son journal à l'origine de la dépêche. Plusieurs chantiers majeurs d'évolutions ont donc été lancés en interne autour d'OpenJDK. Mais Sun a aussi voulu intégrer la communauté Java dans le projet pour prendre en compte le retour d'expérience des utilisateurs quotidiens de sa plate-forme. À cet effet, Sun a initié le projet Coin dans le but de lister les "petites" améliorations qui pourraient être intégrées. Sun a donc misé sur le débat ouvert puisqu'il était permis à tous de soumettre ses idées d'évolution. Et le moins que l'on puisse dire est que ce "projet autour du projet" a porté ses fruits puisque ce n'est pas moins de 70 propositions qui ont été soumises (voir cet article du blog d'Alex Miller qui en a fait une liste exhaustive et documentée). S'en est suivie une longue période de débats, mais après quelques rebondissements de dernière minutes, nous connaissons (enfin) les 5 propositions de la communauté qui ont été retenues :

  • Possibilité d'utiliser des String dans les switch
    Tout développeur Java s'est déjà retrouvé dans l'impossibilité d'utiliser des chaînes de caractères dans les structures switch. Cette fonctionnalité bien pratique existait depuis longtemps dans bien des langages et ce sera bientôt chose faite pour Java.
  • Gestion automatique des ressources
    La mémoire est gérée automatiquement en Java et cela dans le but de soulager le développeur dans le développement d'applications haut niveau. Cependant cela n'était pas le cas des autres ressources comme les documents qu'il fallait ouvrir, et surtout, fermer à la main. Cette amélioration de Java 7 vise à automatiser cette gestion même s'il est peu probable que l'on en arrive au niveau de gestion de la mémoire.
  • Amélioration des instanciations génériques
    Voici une nouveauté qui ne sera en fait qu'une simplification d'écriture dans le but d'alléger le code. Il ne sera désormais plus nécessaire de spécifier le type des éléments de listes génériques lors de la déclaration ET de l'allocation, celle-ci devenant évidente.

    Voici un exemple avec la syntaxe actuelle :
    List<Integer, List> liste = new ArrayList<Integer, List>();
    Java 7 permettra d'écrire :
    List<Integer, List> liste = new ArrayList<>();

  • Simplification des varargs
    Voici une autre modification qui a pour but de simplifier la vie du développeur sans pour autant apporter de grande nouveauté. En l'occurrence l'emploi du code suivant qui était jusqu'alors sujet au warning "uses unchecked or unsafe operations".
    static List asList(T... elements) { ... }
    static List stringFactories() {
    Callable a, b, c;
    ...
    *// Warning: **"uses unchecked or unsafe operations"*
    return asList(a, b, c);
    }

  • Support de langages de script
    Un des sujets d'attentes était la possibilité d'intégrer des langages de script comme le Ruby et le Python dans la JVM. C'est désormais le cas via la JSR 292 (Java Specification Request). Ceci est expliqué plus en détail dans ce mail d'archive de la mailing list du projet Coin.
  • Closures ou non ?
    Comme expliqué plus haut dans l'article, des évènements de dernières minutes sont venus créer des remous dans la communauté Java. Beaucoup de membres espéraient en effet que la proposition d'intégration des Closure allait être acceptée. Cependant celles-ci ne figuraient pas dans la liste des améliorations retenues par le projet Coin pour Java 7. Rebondissement lors de la conférence Devoxx 2009 : Mark Reinhold, ingénieur chez Sun sur le projet OpenJDK annonçait finalement leur acceptation. Depuis aucune information n'est venue confirmer ou infirmer ce dernier commentaire.
    Pour mémoire, les closures, qui existent déjà dans nombre de langages comme le C++, sont des sous-fonctions définies dans le corps de fonctions et qui portent sur les variables locales de cette fonction.
Comme on peut le voir, les nouveautés apportées par le projet Coin pour Java 7 sont principalement d'ordre esthétique mais ce sont aussi ces détails qui facilitent le quotidien du développeur. À noter que nombre de propositions plus "de fond" n'ont pas été retenue comme par exemple l'autorisation des multi-catch pour gérer plusieurs types d'exceptions en une fois.

Sun développe aussi des efforts en direction des performances de la JVM comme en témoigne ce projet de compression des adresses des pointeurs 64 bits. Mais une amélioration plus intéressante encore se situe au niveau du Garbage Collector, l'outil de libération mémoire des objets du développeur. Le nouveau Garbage Collector "Garbage First G1" devrait passer moins de temps en pause et ainsi d'améliorer l'efficacité de la JVM. Espérons que ces promesses se réaliseront : le Garbage Collector joue un rôle sensible et est souvent un acteur majeur dans nombre de cas d'applications aux performances déteriorées. Dans la veine de ces améliorations, citons aussi le classloader et la concurrence dans les accès IO qui devraient être revus ainsi qu'une bonne partie du chapitre 2D des applications client léger Java.

Autre grande nouveauté du langage Java à proprement parler : la possibilité d'annoter les types afin de leur adjoindre certaines caractéristiques. L'auteur de la JSR en cause propose des exemples très parlants dont la seule vue devrait inspirer les développeurs Java tant ils produisent du code simple et clair :
public int size() @Readonly { ... }

Map<@NonNull String, @NonEmpty List> files;

Au sujet des tableaux :
Document[@Readonly] docs1;
Document[][@Readonly] docs2 = new Document[2][@Readonly 12];

Cast de type :
myString = (@NonNull String)myObject;
Tests de types :
boolean isNonNull = myString instanceof @NonNull String;
Création d'objet :
new @NonEmpty @Readonly List(myNonEmptyStringSet)
Clauses throws
void monitorTemperature() throws @Critical TemperatureException { ... }
Dernière amélioration majeure qui va sûrement retenir l'attention des utilisateurs de Java : la modularisation de la JVM. Le projet Jigsaw attendait depuis longtemps dans les cartons de Sun mais n'avait pas réussi à voir le jour tant ses implications sont importantes. La JVM de Sun est devenue très volumineuse et cela se ressent lors de son téléchargement et de son lancement. Ce projet a pour but de modulariser la JVM pour permettre de ne faire télécharger à l'utilisateur que ce dont il a besoin un peu à la manière d'un distribution Linux. En cas d'utilisation d'une nouvelle application, il suffirait alors de compléter la JVM par les modules qui n'ont pas encore été téléchargés la première fois et dont cette nouvelle application a besoin. L'apport en terme de souplesse de lancement est tout aussi prometteur.

Voilà donc de bien belles promesses qui ne demandent plus qu'à être testées dans les snapshots disponibles de Java 7.

Aller plus loin

  • # Cf le journal

    Posté par  (site web personnel) . Évalué à 3.

    Les exemples de "Amélioration des instanciations génériques" sont faux ou incomplets (Templeet qui fait des siennes ?). En tout cas ils ne montrent pas du tout la nouveauté

    L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire

    • [^] # Re: Cf le journal

      Posté par  (site web personnel) . Évalué à 3.

      > Templeet qui fait des siennes ?

      Exactement. À chaque fois que l'on édite la dépêche, il retransforme les entités html en symboles, ce qui produit du HTML pas valide qui s'affiche mal dans les navigateurs.
      • [^] # Re: Cf le journal

        Posté par  (site web personnel) . Évalué à 8.

        Bon, tu sais ce que ça veut dire :
        - soit il faut corriger Templeet,
        - soit il faut accélérer la refonte de DLFP

        /o\ pas taper !

        L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire

  • # l'utilité de la modularisation?

    Posté par  (site web personnel) . Évalué à 2.

    sachant que le taux de pénétration de java tourne autour de 90%
    à quoi bon la modularisation?
    l'utilisateur a déjà tout le nécessaire...

    www.solutions-norenda.com

    • [^] # Re: l'utilité de la modularisation?

      Posté par  . Évalué à 3.

      La taille du DL n'est qu'une petite partie du problème. Mêmes si tu as déjà tout sur le disque le but de modulariser est de clarifier et de nettoyer les dépendances entre les sous systèmes. Il commence a y avoir beaucoup d'API interconnectées dans l'API ce qui pose des problèmes de maintenance et de performances.

      Le nettoyage permet de rationaliser les dépendances, ce qui devrait au final finir par permettre de gagner en performance et en empreinte mémoire. Lance un hello world ou une petite applis avec -verbose:class pour voir un peu le nombres de classes chargées.
      • [^] # Re: l'utilité de la modularisation?

        Posté par  . Évalué à 4.

        Je viens de faire le test, ça fait peur !


        [windu@windu-PC src]$ java -verbose:class Test
        [Opened /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Object from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.Serializable from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Comparable from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.CharSequence from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.String from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.reflect.GenericDeclaration from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.reflect.Type from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.reflect.AnnotatedElement from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Class from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Cloneable from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ClassLoader from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.System from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Throwable from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Error from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ThreadDeath from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Exception from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.RuntimeException from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.ProtectionDomain from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.AccessControlContext from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ClassNotFoundException from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.LinkageError from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.NoClassDefFoundError from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ClassCastException from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ArrayStoreException from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.VirtualMachineError from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.OutOfMemoryError from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.StackOverflowError from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.IllegalMonitorStateException from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ref.Reference from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ref.SoftReference from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ref.WeakReference from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ref.FinalReference from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ref.PhantomReference from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ref.Finalizer from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Runnable from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Thread from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Thread$UncaughtExceptionHandler from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ThreadGroup from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Map from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Dictionary from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Hashtable from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Properties from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.reflect.AccessibleObject from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.reflect.Member from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.reflect.Field from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.reflect.Method from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.reflect.Constructor from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.MagicAccessorImpl from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.MethodAccessor from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.MethodAccessorImpl from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.ConstructorAccessor from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.ConstructorAccessorImpl from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.DelegatingClassLoader from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.ConstantPool from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.FieldAccessor from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.FieldAccessorImpl from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.UnsafeFieldAccessorImpl from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.UnsafeStaticFieldAccessorImpl from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Iterable from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Collection from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.List from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.RandomAccess from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.AbstractCollection from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.AbstractList from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Vector from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Appendable from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.AbstractStringBuilder from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.StringBuffer from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.StackTraceElement from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.Buffer from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Boolean from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Character from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Number from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Float from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Double from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Byte from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Short from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Integer from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Long from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.NullPointerException from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ArithmeticException from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.ObjectStreamField from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Comparator from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.String$CaseInsensitiveComparator from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.Guard from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.Permission from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.BasicPermission from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.RuntimePermission from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.AbstractMap from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.SoftCache from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ref.ReferenceQueue from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ref.ReferenceQueue$Null from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ref.ReferenceQueue$Lock from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.HashMap from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.annotation.Annotation from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Map$Entry from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.HashMap$Entry from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.AccessController from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.reflect.ReflectPermission from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.PrivilegedAction from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.ReflectionFactory$GetReflectionFactoryAction from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Stack from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.ReflectionFactory from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ref.Reference$Lock from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ref.Reference$ReferenceHandler from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ref.Finalizer$FinalizerThread from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Hashtable$Entry from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.charset.Charset from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.charset.spi.CharsetProvider from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.nio.cs.FastCharsetProvider from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.nio.cs.StandardCharsets from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.util.PreHashedMap from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.nio.cs.StandardCharsets$Aliases from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.nio.cs.StandardCharsets$Classes from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.nio.cs.StandardCharsets$Cache from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ThreadLocal from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.concurrent.atomic.AtomicInteger from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.Unsafe from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.IncompatibleClassChangeError from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.NoSuchMethodError from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.Reflection from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Math from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Set from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.AbstractSet from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.HashMap$EntrySet from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Iterator from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.HashMap$HashIterator from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.HashMap$EntryIterator from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Class$3 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.reflect.Modifier from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.LangReflectAccess from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.reflect.ReflectAccess from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Arrays from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.StringBuilder from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.nio.cs.HistoricallyNamedCharset from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.nio.cs.Unicode from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.nio.cs.UTF_8 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Class$1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.ReflectionFactory$1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.NativeConstructorAccessorImpl from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.DelegatingConstructorAccessorImpl from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.VM from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.StringCoding from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ThreadLocal$ThreadLocalMap from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ThreadLocal$ThreadLocalMap$Entry from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.StringCoding$StringDecoder from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.charset.CharsetDecoder from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.nio.cs.UTF_8$Decoder from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.charset.CodingErrorAction from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.ByteBuffer from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.HeapByteBuffer from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.Bits from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.ByteOrder from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Readable from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.CharBuffer from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.HeapCharBuffer from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.charset.CoderResult from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.charset.CoderResult$Cache from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.charset.CoderResult$1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.charset.CoderResult$2 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.Version from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.Closeable from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.InputStream from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.FileInputStream from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.FileDescriptor from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.JavaIOFileDescriptorAccess from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.FileDescriptor$1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.SharedSecrets from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.Flushable from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.OutputStream from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.FileOutputStream from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.FilterInputStream from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.BufferedInputStream from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.concurrent.atomic.AtomicReferenceFieldUpdater from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.reflect.misc.ReflectUtil from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.FilterOutputStream from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.PrintStream from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.BufferedOutputStream from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.Writer from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.OutputStreamWriter from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.nio.cs.StreamEncoder from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.security.action.GetPropertyAction from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.nio.charset.CharsetEncoder from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.nio.cs.UTF_8$Encoder from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.BufferedWriter from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Runtime from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.File from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.FileSystem from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.UnixFileSystem from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.ExpiringCache from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.LinkedHashMap from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.ExpiringCache$1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.LinkedHashMap$Entry from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.JavaIODeleteOnExitAccess from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.File$1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ClassLoader$3 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.StringCoding$StringEncoder from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.ExpiringCache$Entry from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ClassLoader$NativeLibrary from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Terminator from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.SignalHandler from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Terminator$1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.Signal from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.NativeSignalHandler from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.Console from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.JavaIOAccess from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.Console$1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.Console$1$1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Shutdown from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.ArrayList from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Shutdown$Lock from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.ApplicationShutdownHooks from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.IdentityHashMap from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.OSEnvironment from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.JavaLangAccess from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.System$2 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Compiler from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.Compiler$1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.Launcher from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.net.URLStreamHandlerFactory from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.Launcher$Factory from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.SecureClassLoader from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.net.URLClassLoader from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.Launcher$ExtClassLoader from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.security.util.Debug from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.JavaNetAccess from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.net.URLClassLoader$7 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Enumeration from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.StringTokenizer from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.PrivilegedExceptionAction from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.Launcher$ExtClassLoader$1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.MetaIndex from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.Reader from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.BufferedReader from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.InputStreamReader from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.FileReader from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.nio.cs.StreamDecoder from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.reflect.Array from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.net.www.ParseUtil from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.BitSet from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.ObjectStreamClass from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.net.URL from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Locale from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.concurrent.ConcurrentMap from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.concurrent.ConcurrentHashMap from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.concurrent.locks.Lock from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.concurrent.locks.ReentrantLock from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.concurrent.ConcurrentHashMap$Segment from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.concurrent.locks.AbstractOwnableSynchronizer from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.concurrent.locks.AbstractQueuedSynchronizer from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.concurrent.locks.ReentrantLock$Sync from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.concurrent.locks.ReentrantLock$NonfairSync from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.concurrent.locks.AbstractQueuedSynchronizer$Node from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.concurrent.ConcurrentHashMap$HashEntry from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.CharacterData from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.CharacterDataLatin1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.net.Parts from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.net.URLStreamHandler from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.net.www.protocol.file.Handler from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.HashSet from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.URLClassPath from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.net.www.protocol.jar.Handler from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.Launcher$AppClassLoader from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.Launcher$AppClassLoader$1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.lang.SystemClassLoaderAction from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.net.URLClassLoader$1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.URLClassPath$3 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.URLClassPath$Loader from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.URLClassPath$JarLoader from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.PrivilegedActionException from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.URLClassPath$FileLoader from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.Resource from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.URLClassPath$FileLoader$1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.nio.ByteBuffered from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.CodeSource from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.PermissionCollection from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.Permissions from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.net.URLConnection from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.net.www.URLConnection from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.net.www.protocol.file.FileURLConnection from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.net.ContentHandler from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.net.UnknownContentHandler from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.net.www.MessageHeader from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.FilePermission from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.FilePermission$1 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.Policy from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.security.provider.PolicyFile from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.Policy$UnsupportedEmptyCollection from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.FilePermissionCollection from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.AllPermission from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.UnresolvedPermission from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.BasicPermissionCollection from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded sun.misc.JavaSecurityProtectionDomainAccess from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.ProtectionDomain$2 from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.ProtectionDomain$Key from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.Principal from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.security.cert.Certificate from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded Test from file:/home/windu/workspace/JCaddie/src/]
        Hello world !
        [Loaded java.util.ArrayList$Itr from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.IdentityHashMap$KeySet from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.IdentityHashMap$IdentityHashMapIterator from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.IdentityHashMap$KeyIterator from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.io.DeleteOnExitHook from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.LinkedHashSet from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.HashMap$KeySet from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.LinkedHashMap$LinkedHashIterator from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.LinkedHashMap$KeyIterator from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Collections from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Collections$EmptySet from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Collections$EmptyList from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]
        [Loaded java.util.Collections$EmptyMap from /usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar]


        Au passage, on remarque que l'affichage du texte a lieu avant que la JVM n'ait fini de charger les classes...
    • [^] # Re: l'utilité de la modularisation?

      Posté par  . Évalué à 7.

      Peut etre à lancer la JVM plus vite. Et puis une empreinte mémoire moindre.
    • [^] # Re: l'utilité de la modularisation?

      Posté par  (site web personnel) . Évalué à 2.

      Je connais des gens qui sont réfractaires à l'idée d'installer la JVM parce qu'elle est trop grosse. Peut-être que la modularisation les fera changer d'avis.

      Si ça pouvait améliorer la vitesse de démarrage de la JVM pour les applications WebStart, ce serait génial. Peut-être qu'on pourrait enfin avoir de vraies applications WebStart à la place des "applications web 2.0" écrites dans des langages en mousse non adaptés et pas vraiment portables (différences de rendus, différentes fonctions supportées...) et qui s'exécutent dans des VM navigateurs super lents car pas faits pour ça, qui en plus utilisent un protocole réseau non adapté (HTTP), sous-exploitent TCP, ignorent UDP, et réinventent la gestion des fenêtres/onglets et autres widgets alors que ça n'est pas leur rôle.

      Bref tout ce qui fait qu'en 2010 on arrive à faire ramer un Core I7 en surfant sur ce qu'est devenu le Web (et oui une appli Java est au moins aussi rapide qu'un firefox exécutant du JavaScript, et sans parler de Flash).

      À quand le support de la 3D accélérée directement dans HTML pour pouvoir faire des applications comme http://bytonic.de/html/jake2_webstart.html (qui existe depuis plus de 3 ans)...
      • [^] # Re: l'utilité de la modularisation?

        Posté par  . Évalué à 4.

        et oui une appli Java est au moins aussi rapide qu'un firefox exécutant du JavaScript

        Mais elle est 1000 fois moins intégrée à la page, si tu veux pouvoir manipuler les éléments de ta page, utiliser les fonctionnalités du navigateur (comme retenir le mot de passe, ...), c'est complètement impossible. Autant refaire les pages entièrement en Java ou en Flash: ça existe déjà et c'est pénible au possible.

        « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

        • [^] # Re: l'utilité de la modularisation?

          Posté par  (site web personnel) . Évalué à 10.

          Je ne parle pas d'applet (appliquette ? ;-) ) Java mais d'application Java. Donc je ne parle pas du cas où tu voudrais manipuler les éléments de ta page (quelle idée aussi) à partir de Java.

          Ce que je voulais dire c'est qu'on est en train de réinventer, en se basant sur des technologies inadaptées, ce qui existe déjà et qui a été conçu pour. Quand on voit ce que prévoit HTML5, c'est du n'importe quoi :
          * API for playing of video and audio which can be used with the new video and audio elements.
          * An API that enables offline Web applications.
          * An API that allows a Web application to register itself for certain protocols or media types.
          * Editing API in combination with a new global contenteditable attribute.
          * Drag & drop API in combination with a draggable attribute.
          * API that exposes the history and allows pages to add to it to prevent breaking the back button.


          Bref je suis pour qu'on sépare clairement le Web simple et statique (textes + images + vidéos, liens = document) des applications qui utilisent Internet. Le mélange des genres sans avoir préalablement réfléchi au problème devient une usine à gaz...
      • [^] # Re: l'utilité de la modularisation?

        Posté par  . Évalué à 2.

        alors faudra juste éviter ce genre de gags :

        http://www.mail-archive.com/full-disclosure@lists.grok.org.u(...)

        bah oui, quand je vois ce genre de trucs passer, en 2010, y'a de quoi se fâcher

        (et je passe sur le précédent qui en gros utilisait une option -Xquelque chose qui permettait de charger une autre lib ou dll de VM que celle installée, option non documentée et normalement utilisée seulement et exclusivement par les développeurs de la JVM, c'est à dire un outil de debug mais seulement à leur intention. alors bon ce genre de build en version debug et trouée par défaut en centaines de millions d'exemplaires dans la nature...)
      • [^] # Re: l'utilité de la modularisation?

        Posté par  . Évalué à 3.

        À quand le support de la 3D accélérée directement dans HTML pour pouvoir faire des applications comme http://bytonic.de/html/jake2_webstart.html (qui existe depuis plus de 3 ans)...

        À quand ? Pas plus tard que le mois dernier: http://code.google.com/p/quake2-gwt-port/
      • [^] # Re: l'utilité de la modularisation?

        Posté par  . Évalué à 6.

        On a pas attendu java pour créer des applications réseau. Je suis par contre d'accord avec toi qu'il y a actellement une course effrénée qui consiste grosso modo à tout réécrire à partir de HTTP, PHP, javascript. Ce phénomène est grandement poussé par les administrateurs système qui sont tout fier de bloquer tout les ports sauf le port 80...

        Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

  • # Pas compris

    Posté par  . Évalué à 1.

    public int size() @Readonly { ... }

    Ça fait quoi ?

    (size() est une fonction, qui retourne un int, mais je ne comprends pas le @Readonly).
    • [^] # Re: Pas compris

      Posté par  . Évalué à 2.

      Si c'est comme le const en C++, ça ne concerne pas la valeur de retour, mais ça voudrait dire que la méthode size() ne fait aucune écriture et n'appelle que des méthodes qui elles aussi sont @ReadOnly.

      Par contre le lien dit que ce ne sont que des exemples et qu'aucune annotation n'est proposée; que ça ne change pas la sémantique de java au moment de la compilation ni au runtime.
  • # Qu'en est-il...

    Posté par  . Évalué à 3.

    A un moment donné, on parlait d'une syntaxe permettant de ne plus avoir besoin d'écrire les getters et setters.

    C'est à dire qu'à la déclaration d'un attribut d'une classe, on disait s'il était accessible en lecture seulement, écriture seulement, ou les deux.

    Bref on y accédait avec o.x, au lieu de o.getX() ou o.setX()

    Vous savez ce qu'il en est ?
    • [^] # Re: Qu'en est-il...

      Posté par  (site web personnel) . Évalué à 2.

      j'avais lu il y a peu sur developpez que ce n'étais pas été retenu...
      de toute façon avec les ide, ça peut être généré automatiquement.... ce qui limite l'intérêt

      www.solutions-norenda.com

      • [^] # Re: Qu'en est-il...

        Posté par  . Évalué à 10.

        de toute façon avec les ide, ça peut être généré automatiquement.... ce qui limite l'intérêt

        Toute la philosophie Java résumée en une phrase. Merci.
        • [^] # Re: Qu'en est-il...

          Posté par  (site web personnel) . Évalué à 2.

          ça s'applique pour tous les langages qui s'applique possède des IDE

          je préfère qu'il mettre plutôt du temps sur des fonctionnalités vraiment utile, amélioration performance.... que de miser dans de la syntaxe bonbon

          www.solutions-norenda.com

          • [^] # Re: Qu'en est-il...

            Posté par  . Évalué à 5.

            « ça s'applique pour tous les langages qui s'applique possède des IDE »
            Je ne comprends vraiment pas cette phrase...

            Sinon si un IDE est capable d'écrire cette partie du code à ta place pourquoi est ce que le compilateur ne saurait pas le faire ? Ça permet de ne pas avoir à se taper des IDE qui bouffent des ressources monstres et de permettre aux développeurs de choisir leur méthode de développement. Par exemple sur mon ordinateur (un netbook), eclipse refuse de se lancer et netbeans est extrêmement lent. J'utilise des build.xml et ça compile très vite (et je peux accepter des tant de compilation bien plus long sans problème).

            Si on veut perdre l'image de langage usine à gaz, lourd et rapide comme un pachyderme, faut un peu se pencher sur la manière de développer des programmeurs et arrêter de prendre comme postulat que le développeur a internet et une machine puissante.

            Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

            • [^] # Re: Qu'en est-il...

              Posté par  . Évalué à 1.

              « ça s'applique pour tous les langages qui s'applique possède des IDE »
              Je ne comprends vraiment pas cette phrase...


              Normal, l'orthographe et la grammaire ne servent à rien quand tu utilises un IDE.
            • [^] # Re: Qu'en est-il...

              Posté par  . Évalué à 2.

              et je peux accepter des tant de compilation bien plus long sans problème
              c'est l'hôpital que se fout de la charité
              • [^] # Re: Qu'en est-il...

                Posté par  . Évalué à 4.

                Faut le comprendre aussi, y a tellement d'homonymes...

                "OTAN, suspend ton vol !"
                "Taon va la cruche à l'eau... "
              • [^] # Re: Qu'en est-il...

                Posté par  . Évalué à 2.

                Non pas du tout.

                Tu prend un cas concret, j'ai actuellement un projet java que je développe sur mon netbook. La compilation prend 7 secondes avec ant. Ça ne me dérangerais pas énormément d'avoir 10 secondes de compilation (c'est un petit projet) ou en tout cas ça me dérange moins que d'avoir 15 secondes pour lancer l'IDE, 4 secondes quand j'ouvre un fichier ou que je change de fichier et 3 secondes quand j'enregistre un fichier.

                Ce que je dis c'est que je préfère déplacer la complexité au niveau du compilateur que de l'IDE quand cela est possible. Parce que mon IDE je m'en sers en continue pendant des heures alors que le compilateur je l'utilise de manière ponctuel.

                Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

            • [^] # Re: Qu'en est-il...

              Posté par  (site web personnel) . Évalué à -1.

              fallait enlever un mot...
              ça s'applique pour tous les langages qui possède des IDE

              il s'en suit que tu as vraiment pas compris l'utilité de tel produit

              www.solutions-norenda.com

            • [^] # Re: Qu'en est-il...

              Posté par  . Évalué à 2.


              Sinon si un IDE est capable d'écrire cette partie du code à ta place pourquoi est ce que le compilateur ne saurait pas le faire ?

              Malheureusement ca n'est pas possible, il y a des fois où tu vas être amené à écrire ce code à la main.
            • [^] # Re: Qu'en est-il...

              Posté par  . Évalué à 2.

              Sinon si un IDE est capable d'écrire cette partie du code à ta place pourquoi est ce que le compilateur ne saurait pas le faire ?

              Il faudrait que tu codes dans ton code l'équivalent du "écris cette partie du code à ma place" ou encore "lance telle commande de refactoring sur mon code" pour que le compilateur l'interprête et tout.

              Or c'est pas le rôle du compilateur d'écrire du code, il fait de la transformation de code dans un autre code ... Tu peux t'attendre probablement à un ralongement des temps de compilation, ou à lancer d'autres commandes qui sont faites pour.
              • [^] # Re: Qu'en est-il...

                Posté par  . Évalué à 2.

                pourquoi se faire $*@# à écrire le même pattern encore, encore, encore et encore ?

                pourquoi générer du code ? c'est perdre de l'information, la dévaloriser !

                pourquoi abuser du copier/coller ? à moins d'en vouloir aux gens qui vont relire...

                le but d'un langage c'est quand même d'avoir le maximum d'information tout en ayant le minimum à exprimer
                • [^] # Re: Qu'en est-il...

                  Posté par  . Évalué à 2.

                  > le but d'un langage c'est quand même d'avoir le maximum d'information tout en ayant le minimum à exprimer

                  genre perl, ou APL ?

                  alors oui, mais non...
              • [^] # Re: Qu'en est-il...

                Posté par  . Évalué à 2.

                Qu'est ce qui empêche le langage d'avoir des mot clef readonly, writeonly et readwrite à la place de public, private et protected pour les données membres ?

                Transformer du code d'un langage à un autre c'est générer du code.

                Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

                • [^] # Re: Qu'en est-il...

                  Posté par  . Évalué à 2.

                  Les compilateurs que tu utlises pour compiler ton code en code exécutable ils font la transformation "langage haut niveau" vers "langage bas niveau" en général. Ce qui implique qu'ils se moquent complètement de l'indentation de ton code original, par exemple. Sauf pour faire la gestion des affichage des erreurs.

                  C'est pas leur boulot à priori. Contrairement à un IDE comme eclipse qui garde le code sous forme de code, une représentation un peu plus manipulable en interne, et un "mapping" entre les deux (enfin j'imagine) ce qui lui permet de faire entre autre du refactoring et la compilation "à la volée" de juste ce qui a été modifié dans le code.

                  Bref, en schématisant, un compilateur c'est "texte" -> "représentation intermédiaire" -> "représentation de plus bas niveau" tandis qu'eclipse c'est "texte" <-> "représentation intermédiaire" -> "bas niveau" si je raconte pas trop de conneries.
                  • [^] # Re: Qu'en est-il...

                    Posté par  . Évalué à 2.

                    J'ai jamais parlé de générer du code source, juste de considérer les variables comme plus ou moins accessibles.

                    Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

          • [^] # Re: Qu'en est-il...

            Posté par  . Évalué à 3.

            ça s'applique pour tous les langages qui s'applique possède des IDE

            Non, ça s'applique pour les programmeurs médiocres qui font du code en écriture seule (write-only). Le code informatique doit être avant tout facile à lire (par un collègue, par un contributeur, ou par toi-même dans six mois). Ton IDE rend le code facile à écrire, mais certainement pas facile à lire (puisque l'IDE est ici une excuse pour laisser passer des constructions lourdes, verbeuses et malcommodes).
            • [^] # Re: Qu'en est-il...

              Posté par  . Évalué à 7.

              Oui enfin, un IDE ce n'est pas que ça hein...

              Un IDE c'est du refactoring facile (pour rendre le code plus clair, plus élégant, plus factorisé), c'est de la navigation facile dans le code (pour le relire justement), c'est de l'intégration avec des outils de gestion de versions, de rapport de bugs, de documentation, c'est de l'aide au debuggage, profiling, etc...

              Ça commence à bien faire de toujours cracher sur les IDEs quand on est passé à côté de leur intérêt !
            • [^] # Re: Qu'en est-il...

              Posté par  . Évalué à 2.

              le code informatique doit plutôt être facilement compréhensible par un collègue.

              Qu'il soit moins facile à lire parce que plus verbeux, faudra me le prouver. Je préfère un code verbeux, explicite qu'un code avec pleins de raccourcis implicites

              if (toto == 1){
              titi = 2;
              } else {
              titi = 4;
              }


              est pour moi plus verbeux mais plus facile à lire que :

              toto = 1 ? titi=2 : titi=3;


              De même que

              if (toto== true)
              est plus compréhensible pour moi que :
              if (toto)


              En résumé, ce n'est pas parce que le code est plus court qu'il est plus compréhensible rapidement. Mais il est vrai qu'un code trop long est difficile également à lire.
              • [^] # Re: Qu'en est-il...

                Posté par  . Évalué à 7.

                tsss faut écrire :
                titi = toto == 1 ? 2 : 3; // soleil
                et indenter son code et ne pas oublier les commentaires
                • [^] # Re: Qu'en est-il...

                  Posté par  . Évalué à 2.

                  ce qui montre bien que je n'aime pas trop cette syntaxe, vu que je ne sais même pas l'écrire.

                  Pour l'indentation, la touche tab ne fonctionne pas comme je voudrais quand j'écris mon commentaire, j'espère que cela me servira d'excuse. PS : merci de ne pas partir sur indentation tab vs indentation espace.
              • [^] # Re: Qu'en est-il...

                Posté par  . Évalué à 5.

                ouais enfin:
                if (toto==true)
                C'est une lapalissade, ou alors t'as rien compris au concept des boucles conditionnelles.

                Sedullus dux et princeps Lemovicum occiditur

              • [^] # Re: Qu'en est-il...

                Posté par  . Évalué à 3.

                Qu'il soit moins facile à lire parce que plus verbeux, faudra me le prouver.

                Ce n'est pas seulement une question de verbosité, c'est aussi une question d'expressivité.
                Par exemple, dans un langage à fermetures, certaines choses s'expriment beaucoup plus naturellement que dans un langage sans fermetures.

                Plus concrètement : prends le code d'un programme Python et écris le code équivalent en C, par exemple.
                • [^] # Re: Qu'en est-il...

                  Posté par  . Évalué à 5.

                  Par exemple, dans un langage à fermetures, certaines choses s'expriment beaucoup plus naturellement que dans un langage sans fermetures.

                  Avec un langage avec fermeture, on code comme l'éclair?
        • [^] # Re: Qu'en est-il...

          Posté par  . Évalué à 2.

          Cette philosophie explique son succès et après avoir passé ma période "je veux toutes les features du monde dans le langage", je me rends compte que c'est un bon choix pour une plateforme de développement.

          Un langage simple et des outils puissants permettent au développeur de facilement:

          - se former.
          - comprendre le codes des autres.
          - ne pas hésiter à faire du refactoring, de la gestion de version, de l'analyse de code ou de l'intégration continue.

          C'est ce que je constate dans mon entreprise : les développeurs Java sont plus heureux et ont le poil plus brillant.

          Pour ma part, j'ai toujours aimé les langages un peu plus couillus et je lorgne vers Scala :-)
          • [^] # Re: Qu'en est-il...

            Posté par  . Évalué à 1.

            Un langage simple

            Je n'ai pas l'impression que Java est un langage simple. C'est un langage qui a fait le choix de développer la bureaucratie plutôt que l'expressivité.

            La grammaire de Java :
            http://www.flickr.com/photos/nicksieger/280662707/
            Les grammaires de C et Python :
            http://www.flickr.com/photos/nicksieger/281055530/
            http://www.flickr.com/photos/nicksieger/281055485/
            • [^] # Re: Qu'en est-il...

              Posté par  . Évalué à 5.

              Est-ce que la complexité d'un langage se mesure avec sa grammaire?

              Je ne sais pas, mais je ne connais aucun développeur qui trouve C plus simple que Java.
            • [^] # Re: Qu'en est-il...

              Posté par  . Évalué à 4.

              Je préfère un langage qui supporte les threads qu'un langage qui se réfugie derrière le multiprocess à cause du GIL (ou qui fait appel à des implémentations différentes pour pallier ses faiblesses comme ironpython ou jython)

              Je préfère un langage qui fait la différence entre des champs privés publics ou protégé et qui ne réfugie pas derrière des astuces d'implémentation.

              Je préfère un langage qui ne recourt pas à des idiomes pour que sa grammaire tienne dans une image réduite de flickr

              while True:
              do_something()
              if condition():
              break


              Je préfère un langage qui fait supporte pleinement l'héritage ou le multi-héritage à du duck-typing qui te pète à la tronche en prod au lieu de la compil.

              Je préfère un langage qui ne pète pas tout ton code à chaque réindentation

              ...
              • [^] # Re: Qu'en est-il...

                Posté par  . Évalué à 3.

                duck-typing qui te pète à la tronche en prod au lieu de la compil

                Oui, le duck typing ça fait coin.
          • [^] # Re: Qu'en est-il...

            Posté par  . Évalué à 2.

            Je ne pense pas qu'obliger les développeurs à utiliser un gros IDE aide à sa compréhension.

            Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.