Valentin Jacquemin

Package java.lang.reflect

Après avoir substantiellement passé en revu le package java.lang, je vais me porter sur java.lang.reflect durant ce post. Comme son nom l’indique, nous retrouvons dans ce package tout l’attirail nécessaire pour jouer avec la reflection. Autrement dit, en ciblant un objet donné, nous pourrons découvrir chacun de ses membres.

A quoi ça sert ?

Concrètement, la reflection trouve son utilité par exemple dans les éditeurs de développement (IDE). Comme l’image ci-dessous le montre, ces outils nous permettent de découvrir la structure d’une classe mais aussi où est-ce qu’elle se trouve dans la hierarchie objet. Ceci souvent au moyen d’un arbre et ce que ce soit en cours de développement mais encore, de manière avantageuse, en cours de débugage.

eclipse_refl

Il existe d’autres utilisations à la reflection comme par exemple dans les processus de sérialisation, dans l’utilisation d’objets métiers distribués (EJB), les containers web et d’inversion de contrôle etc. Mais dans la pratique comment font donc ces IDE pour nous décrire la structure de nos objets? C’est ce que nous allons découvrir maintenant avec la suite de cet article.

Les classes de bases

En plus des classes se trouvant dans ce package, il nous faudra également faire appel à une classe étant dans le package java.lang: Class. Je n’en avais pas encore parlé, voici donc le moment venu… Class représente une classe (ou une interface) tournant dans la machine virtuelle. Les objets Class sont créés automatiquement par la JVM au moyen du ClassLoader (faisant aussi parti du package java.lang) au chargement. Il nous faut en premier lieu utiliser cette classe avant de pouvoir profiter du contenu de java.lang.reflect: Class lClazz = Class.forName(className); Suite à l’exécution de cette ligne de code nous pouvons être certains qu’un objet Class correspondant est créé. En effet, le ClassLoader ne va pas charger toutes les classes de la librairie (ouf!) mais uniquement celles qui sont utilisées dans l’application.

reflect

Comme exemple j’ai créé une petite application1 listant tous les membres d’une classe entrée par l’utilisateur.

Comme vous pouvez le constater dans les sources après avoir l’objet Class tout est accessible grâce aux classes Constructor, Field, Method et Modifiers de l’API java.lang.reflect. A noter que grâce à la reflection, il est possible de contourner les modificateurs d’accès! Pour davantage d’informations, je vous invite à lire Accès privé… pas tant que ça.

Voilà pour les bases de la reflection. Maintenant un peu plus intéressant, découvrons l’utilisation des Proxy et leur importance au sein d’un certain framework.

Proxy

La classe Proxy offre la possibilité de créer des proxy dynamiques. Autrement dit, elle permet d’ajouter une couche entre un objet target et son créateur. Pourquoi rajouter une couche direz-vous… Eh bien pour le découvrir entrons dans les entrailles du framework Spring2. L’un des modules de Spring permet de faire de la programmation par aspect (AOP pour Aspect Oriented Programming) ce qui offre la possibilité de créer des classes avec une meilleure granularité. Voici par exemple la configuration XML permettant d’afficher un message sur la console avant l’appel de certaines méthodes:

<bean id="kwikEMart" 
    class="org.springframework.aop.framework.ProxyFactoryBean">
    <!-- interface interface implémentée par l'objet _target_ -->
    <property name="proxyInterfaces">
        <value>org.poxd.store.KwikEMArt</value>
    </property> 
    <property name="interceptorNames"> 
        <list> 
            <value>welcomeAdvice</value> 
        </list> 
    </property> 
    <property name="target">
        <ref="kwikEMartTarget"/>
    </property>
</bean> `

Nous n’avons ici qu’une partie du travail à effectuer mais il y a ce qu’il nous faut. Ce bout de code XML permet à Spring de créer un ProxyFactoryBean. Cette classe offre la possibilité d’ajouter des interceptors dans le workflow de votre application. Dans notre cas, le bean correspondant à welcomeAdvice sera appelé (suivant une règle définie ailleurs) par exemple avant l’invocation de la méthode start de notre application pour afficher un message de bienvenue_._

proxy

A la base nous avons toujours notre classe ne contenant aucun appel à welcomAdvice. C’est Spring qui va rajouter cet appel avant de poursuivre avec la classe que nous avons développé au départ. Pour ce faire, Spring utilise un Proxy. L’image ci-contre démontre bien le fonctionnement. Avant que le proxy invoke l’objet target il peut faire n’importe quelle opération (dans notre cas appeler welcomeAdvice)! Et de notre côté, l’architecture n’est pas touchée, nos classes ont un focus bien défini.

Voilà en pour ce qui concerne le package java.lang.ref. En attendant que je me penche sur une partie du JDK, les commentaires sont les bienvenus!


  1. Vous pouvez retrouver le code source en cliquant ici – code de démo, entrez dans le champ texte par exemple org.poxd.Reflect ou n’importe quelle classe du JDK ↩︎

  2. Pour une description de ce framework, consultez la section About du site www.springframework.org ↩︎

Apprendre l'anglais

Les cours d’anglais sont peut-être éloignés et vous avez envie de vous y replonger?

J’ai le privilège actuellement de suivre un cours d’anglais par téléphone. Mon employeur a la bonté de m’offrir cette prestation en partenariat avec goFluent. Je dois dire qu’avoir des conversations uniquement en anglais fait progresser, c’est réellement utile. Malheureusement tout le monde n’a pas un employeur aussi sympa et non plus les moyens de s’offrir un telle prestation…

Il existe cependant sur la toile plusieurs ressources extrêmement utiles pour s’améliorer:

Voilà trois moyens offerts gratuitement par Internet pour apprendre l’anglais. Pas belle la vie? Vous connaissez d’autres bon plans? N’hésitez pas à laisser un commentaire.

Je suis un intello!

Avant de me croire prétentieux, qu’est-ce qu’un intello? Peut-être que la définition qui suit ne convient pas à ce terme quoiqu’il en soit je l’aime beaucoup:

Être intello ça veut dire aimer s’instruire, être curieux, attentif, admirer, s’émouvoir, essayer de comprendre comment tout ça tient debout et tenter de se coucher un peu moins con que la veille ((Extrait tiré du livre Ensemble c’est tout d’Anna Gavalda)).

Cette définition fait abstraction de la notion d’intelligence. Tout le monde peut faire preuve de curiosité c’est l’une des seules justices de ce monde, par contre curiosité n’est pas égale à intelligence et malheureusement (ou heureusement peu importe) chacun ne naît pas avec le même capital et les mêmes possibilités.

Mais lorsqu’à l’école un bambin balançait “oh l’intello” il ne voulait pas dire “oh mais comme il est curieux mon camarade”… Mais bien plutôt “celui-là il me gonfle il sait tout!” Dans ce sens la définition ci-dessus n’est peut-être pas adéquate mais qu’elle se rapporte à intello ou n’importe quelle autre expression, je voulais la partager car je l’apprécie beaucoup.

Teach Yourself Programming in ten years

Je suis retombé récemment sur cet article extrêmement intéressant: Teach yourself programming in ten years. Passé l’introduction, Peter Norvig expose plusieurs points qui selon lui sont la recette du succès pour devenir un bon programmeur. Peter Norvig est actuellement Directeur de Recherche chez Google US, il est donc légitime de faire confiance en ses dire. Les voici en résumé:

J’ai pris la liberté de ne pas mentionner tous les points mentionnés dans l’article. Mais rien qu’avec cette liste, il y aura certainement toujours quelque chose à faire, à améliorer. C’est aussi cela qui est passionnant avec l’informatique. Se dire que l’on n’aura jamais fait le tour du sujet, qu’il sera toujours possible d’en apprendre et de nourrir abondamment sa curiosité… Ca ca me plait!

Une aide bienvenue pour se certifier SCWCD

Une seconde édition du livre Head First Servlets and JSP est sortie!

Si vous êtes à la recherche d’une aide adéquate pour obtenir le niveau de la certification SCWCD, ce livre est parfait! Cette seconde édition couvre la spécification 5 de Java Entreprise alors que la précédente portait sur la version 1.4. Par contre pour ceux qui sont déjà certifié sur la version 4 je ne pense pas qu’il y ait un grand intérêt à la passer du fait que les ajouts ont surtout été fait au niveau du langage et moins sur les specs Servlet/JSP.

Faisant partie de la série Head First (existe aussi en français sous le nom Tête la Première - cet ouvrage n’est pas traduit), la lecture est non seulement facile, elle aide énormément à la mémorisation et à la compréhension. Les auteurs se sont en effet mis au courant des dernières avancées en recherche cognitive et on peut dire que c’est sacrément efficace!

Et si vous êtes curieux n’hésitez pas à jeter un oeil aux autres livres de la série qui abordent des sujets plus intéressant les uns que les autres!

Package java.lang

La bibliotheque Java est vaste, tres vaste. Sans conteste cela lui procure une grande richesse puisque de ce fait il est possible de quasiment tout faire avec. Il devient cependant de plus en plus difficile de s’y retrouver a mesure que le langage evolue. Ces evolutions sont bien regulees par le Java Community Process mais n’empeche que les fonctionnalites sont toujours plus nombreuses!

Je vais tenter par une serie de plusieurs articles de parcourir quelques-uns des packages de Java afin de montrer les differentes classes disponibles. Bien sur ce ne sera qu’un survol mais toujours utile, que l’on decouvre le langage ou que l’on ait davantage l’habitude d’utiliser Java (enfin j’espere).

Pour bien commencer, prenons les choses par le debut: java.lang. Ce package est automatiquement importe lorsque l’on developpe en Java. Toutes les classes presentes dans ce package sont tres souvent utilisees dans les programmes et le compilateur nous facilite la vie en faisant lui-meme le lien lorsqu’il en rencontre une utilisation.

Wrapper types

On retrouve ainsi la definition des types de Java (Boolean, Byte, Character… et le venerable Object sans qui rien ne serait possible). On les nomme generalement _Wrapper types _pour faire ressortir que ce n’est que la correspondance des types natifs (ou primitifs) qui sont utilises lorsque l’on fait par exemple:

int theResponse = 42;

Lorsque l’on code sur Java a partir de la version 5, une fonctionnalite existante peut faire completement oublier ce concept: l’autoboxing. En effet, precedemment le code suivant ne compilait pas:

Integer laReponseATteVosQuestion = 42;

Threading

Tous les outils de concurrences ne se trouvent pas dans ce package. Cependant, le socle de base de la programmation multi-threading est integre dans java.lang. On y trouve la classe de base: java.lang.Thread mais aussi par exemple java.lang.ThreadLocal qui est utilisee afin d’implementer le pattern Thread Local Session.

On peut tres bien n’utiliser que la classe Thread pour les besoins concurrents. Nous verrons cependant lorsque nous aborderons le package java.util.concurrent qu’il existe plusieurs outils supplementaires qui facilitent la vie du developpeur lorsqu’il met le pied dans le monde du multi- threading.

Acces systeme

Enfin, plusieurs classes de ce package permettent de faire appel au systeme sur lequel tourne Java.

La classe System contient uniquement des membres statiques permettant par exemple de recuperer le flux de sortie de Java (le flux utilise pour afficher des donnees a l’ecran, la console), le temps actuel en millisecondes ou en nanosecondes, recuperer une variable d’environnement, enregistrer une propriete systeme, charger une classe ou une librairie dynamiquement ou encore enregistrer un SecurityManager personnalise.

La classe Runtime est elle davantage liee au “systeme” de Java. Il est ainsi possible de l’utiliser afin de recuperer la memoire disponible dans la machine virtuelle, lancer le Garbage Collector (aussi possible depuis la classe System qui fait en fait une redirection sur la classe Runtime) et enfin avant de mentionner la derniere classe, Runtime permet d’executer un nouveau processus systeme…

La classe Process liee donc a Runtime mais aussi a ProcessBuilder represente un processus natif. Une utilisation de ce genre de classe peut bien evidemment limiter la portabilite de l’application; il faut par consequent bien reflechir quant a son utilisation.

Par exemple, pour une application graphique permettant d’executer des imports de donnees sur une base Oracle il existe l’outil bien connu Sql Loader qui permet de charger les donner en ligne de commande. Il sera possible d’appeler directement depuis le code Java l’executable d’Oracle de cette maniere:

Process p = new ProcessBuilder("sqlldr", 
                    "userid=root control=control.ctl").start();

Ensuite les flux de sortie, d’entree et d’erreur sont disponibles et doivent etre recuperes afin de pouvoir communiquer avec le processus lance.

Autour de tout cela je n’ai pas pris le temps de parler de l’ensemble d’exceptions et d’erreurs se trouvant dans le package mais comme je l’ai dit dans l’introduction, ce n’est et ne sera qu’un aperçu!

La charte des droits du programmeur

  1. Tout programmeur doit avoir un affichage double écran

  2. Tout programmeur doit avoir une station performante

  3. Tout programmeur doit se procurer lui-même sa souris et son clavier personnels

  4. Tout programmeur doit avoir une chaise confortable

  5. Tout programmeur doit avoir une connexion rapide à Internet

  6. Tout programmeur doit avoir un environnement de travail calme.

Dans ma courte expérience professionnelle, tout ce que je peux dire c’est qu’en Suisse on est bien traité! Un commentaire intéressant sur l’original de cette charte: “mettre des écouteurs, parfois même sans aucune musique (Andre Torrez)” permet simplement de remplir les conditions de l’article numéro 6 de la charte ;) … Ayant travaillé à Lyon durant 3 mois, les conditions m’ont amené à tenter l’expérience avec succès! [source : coding horror]

Lectures #4

Cela fait un bout de temps que je n’ai plus parlé de mes lectures. Je ne vais pas les mentionner toutes mais il y en a une ou deux qui en valent la peine.

Le juge d’Egypte (Christian Jacq)

Les histoires narrées par Christian Jacq sont rarement décevantes. On y retrouve une fois de plus pour son compte grâce aux multiples péripéties rencontrées par Pazair, petit juge provincial. Le personnage est armé de forts sentiments de justice et d’intégrité; bien sûr ce ne sera pas du goût de tout le monde.L’intrigue tourne autour d’un mystérieux vol ayant lieu dans l’une des grandes pyramides. Et ce n’est évidemment qu’à la toute fin que ce jeu de piste s’achève. C’est une lecture captivante et vraiment agréable. On est mené à travers l’Egypte entier, on se trouve immergé dans l’ambiance de cette civilisation quelque peu mythique.

Le bouc émissaire (Daphné Du Maurier)

La seule critique pour cet ouvrage est très favorable.Personnellement, la seule oeuvre que j’avais lu de Daphné Du Maurier auparavant était_ l’Auberge de la Jamaïque_ et il est clair que le résultat n’est pas le même.L’histoire est plus lente et m’a personnellement moins captivé. D’ailleurs j’ai l’impression que si je me lance à expliquer en quelques mots l’histoire j’en dirai déjà beaucoup trop si des candidats à cette lecture passent par là. C’est dire si c’est lent ;) Au delà de cela on retrouve tout de même la belle et agréable écriture de l’auteure avec des personnages très bien décris.J’ai aussi pu lire Cyrano de Bergerac récemment (eh oui je ne l’avais pas encore lu) et force est de constater que c’est un chef d’oeuvre! Un réel hommage à la langue française. C’était un véritable plaisir de me plonger dans ce bouquin, cela ne m’étonnerais pas que je le relise un jour.Pour finir, je déconseille la lecture de J’irai cracher sur vos tombes de Boris Vian. C’est trop cru (voir repoussant) à mon goût.

L'union fait la force

Il est toujours intéressant de parcourir du code source créé par d’autres personnes, c’est à mes yeux une excellente formation pour devenir un bon développeur. Je peux le vérifier en ce moment puisque je travaille sur la résolutions d’incidents sur une application web ayant pour base principale Struts. J’ai été vraiment impressionné par le nombre de classes utilisées simplement pour supporter les opérations ajout, récupération,mise à jour et suppression de données (CRUD). A la décharge de l’équipe ayant créé cette application, il faut avouer que le modèle de Struts encourage à créer une classe par action. Personnellement, je pense que la philosophie objet est respectée si l’on décide de regrouper les opérations CRUD dans une seule et même classe. Le nombre de classes va ainsi diminuer et rendre plus de clarté à l’environnement et l’objectif de chaque classe sera toujours bien défini. De plus pour ne rien gâcher, Struts propose lui-même cette solution! La classe DispatchAction permet en effet au développeur de regrouper plusieurs actions en une-seule. Cette classe se trouvant dans la hiérarchie de la standard Action n’ est donc pas très différente de celle-ci. En reprenant ce qu’explique la javadoc de cette nouvelle recrue, voici comment doter davantage de fonctionnalités à une action:

Le résultat devient tout de même beaucoup plus agréable! La productivité va également sûrement être favorisée du fait qu’il n’y aura plus à jongler entre plusieurs classes pour changer d’opération sur un certain objet… Et le développeur qui devra passer plus tard sur un code plus compact en sera très reconnaissant ;)

Lectures #3

Et si c’était vrai… (Marc Levy)

Tout le monde la déjà lu mais pas moi. Maintenant c’est fait et comme la plupart des lecteurs j’ai été conquis par ce roman. L’histoire menée avec rythme nous envoûte très rapidement. On se sent embarqué au fil des pages dans la vie de cet architecte pour qui tout va bien… Un peu de piment dans sa vie nous plonge dans des réflexions que l’on manque trop facilement au rythme où vont nos vies aujourd’hui.

Cette histoire n’a fait que confirmer une envie en moi…. Visiter la région de San Francisco et la côte jusqu’à Monterey… Un roman qui se dévore et qui laisse un souvenir agréable… Un plaisir! De plus le personnage de Paul est réellement hilarent.

Le dictateur et le hamac (Daniel Pennac)

Mon premier roman de Pennac. Une histoire drôle dans tout les sens du terme. J’en ressors avec dans la tête une histoire confuse mais qui m’a fait passer un bon moment en compagnie du narrateur… dans son hamac. On est projeté dans les péripéties d’un président et de quelques-uns de ses sosies successifs lorsque lui-même se rend compte qu’il est agoraphobe…

Un humour que je n’avais encore que peu rencontré dans les livres… Décalé, délicieux.

Le meilleur des mondes (Aldous Huxley)

Le meilleur des mondes se situe dans les romans d’anticipation. Ecrit après la guerre, ce roman décrit la vie dans un futur où les bébés ne sont plus conçus naturellement mais par un long processus régulé par des humains qui sont eux-mêmes des “humains” conditionnés depuis leur naissance. Pour que l’équilibre soit toujours de mise, un système de classe a été défini. On se retrouve alors à suivre la vie d’un homme de haute classe qui est quelque peu différend des autres… Il réfléchit, se pose des questions, aime être seul…

J’ai eu du mal à entrer réellement dans l’histoire mais finalement ce bouquin m’a plu. L’imagination de l’auteur est impressionnante… A quand les cinéma sentants? La distribution de soppor? La familiarisation à la mort?