Projet IPA 2001 Java : Introspection de classe

 

I. Présentation du contexte

Principe de l'introspection

L'introspection est un mécanisme permettant d'obtenir des informations sur le contenu d'une classe ou d'un objet créé en mémoire.On peut par exemple obtenir le nom de la classe dont un objet est une instance. Mais le mécanisme ne s'arrête pas là, on peut également connaître la liste de tous les champs (variables), de tous les constructeurs et de toutes les méthodes déclarées dans une classe. Ces informations sont enrichies par la connaissance du type des champs et des méthodes et par la connaissance de la liste des paramètres des constructeurs et des méthodes. L'héritage n'est pas oublié car on peut aussi connaître la classe de base d'une classe donnée et reconstruire ainsi la relation d'héritage menant de la classe racine Object à la classe considérée.

Introspection active

L'introspection active permet d'invoquer un constructeur ou une méthode "décelés" par l'introspection. On peut ainsi à partir de la définition d'une classe, créer des objets de cette classe puis invoquer des méthodes (de la classe) sur les objets créés.

Intêret de l'introspection

Lorsqu'on connait la définition d'un objet chargé en mémoire, il est alors possible d'invoquer dynamiquement des méthodes de cet objet sans connaître la définition de l'objet à l'avance. Les JavaBeans sont des composants logiciels écrits en Java permettant de construire "rapidement" des applications. La connaissance de leurs caractéristiques est indispensable pour assembler ces JavaBeans ensemble : les caractéristiques sont déterminées via le mécanisme de l'introspection.

Introspection en Java

En java, l'introspection est réalisée en s'appuyant sur les classes Class, Field, Constructor et Method.

La classe Class est le point de départ de tout le mécanisme d'introspection. Il faut commencer par obtenir un objet de type Class à partir de la classe ou de l'objet dont vous disposez :

Accès aux méthodes de la classe ou de l'objet considéré

Dans la classe Class, la méthode getDeclaredMethods() permet de connaître la liste des méthodes déclarées dans la classe considérée. Cette méthode ne retourne pas un tableau de noms mais un objet de type Method[]. Chaque objet de type Method contenu dans le tableau permet d'obtenir des informations sur la méthode représentée par cet objet. Par exemple, la méthode getReturnType() renvoie le type de retour de la méthode considérée.
Si on reprend l'exemple de code précédent, les instructions suivantes permettent l'affichage du type de retour de la première méthode du tableau :

Method[] fns = cl.getDeclaredMethods();
if (fns.length > 0)
   System.out.println(fns[0].getReturnType());

 

II. Contenu du projet

Vous commencerez par lire la documentation Java sur les classes Class, Field, Constructor et Method. Vous écrirez ensuite un petit programme pour tester votre compréhension de l'emploi de ces classes. Le succès du projet repose sur la bonne compréhension de la documentation Java.

Le programme à écrire propose le menu suivant.

  1. Saisie de la classe à explorer
  2. Membres de la classe
  3. Interfaces implémentées
  4. Hiérarchie d'héritage
  5. Créer un objet de la classe
  6. Invoquer une méthode de la classe sur l'objet créé
  7. Sortir du programme

Pour chaque option du menu, le choix de l'utilisateur amène le programme à réaliser les opérations suivantes :

  1. Saisir au clavier la classe à explorer.
  2. Afficher tous les membres de la classe :
    nom et type des champs
    nom et liste des arguments des constructeurs
    nom, type de retour et liste des arguments des méthodes.
  3. Afficher les noms de toutes les interfaces implémentées par la classe.
  4. Afficher les noms de toutes les super-classes dont dérive la classe saisie. L'arbre d'héritage sera exploré jusqu'à la classe racine Object.
  5. Créer un objet de la classe. Il faudra prendre soin du passage d'éventuels paramètres au constructeur.
  6. Cette option doit être employée après l'option précédente. L'utilisateur saisit le nom d'une méthode, les éventuels arguments puis le programme
    invoque cette méthode sur l'objet créé en lui passant les paramètres saisis.
  7. Sortir du programme
Commencez par définir la structure du programme (classes et méthodes). Vous écrirez ensuite la boucle provoquant l'affichage du menu et la saisie du choix de l'utilisateur. Cela vous permet d'avoir un "squelette" de programme que vous enrichirez progressivement. N'hésitez pas à écrire des fonctions spécialisées pour chaque tâche.

L'achèvement du projet donne une bonne vision de ce qu'est une classe, un objet, une méthode en Java.

III. Soutenance et Compte-rendu

Vous devrez rendre un compte-rendu contenant :

La soutenance consiste en :