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.
- Saisie de la classe à explorer
- Membres de la classe
- Interfaces implémentées
- Hiérarchie d'héritage
- Créer un objet de la classe
- Invoquer une méthode de la classe sur l'objet créé
- Sortir du programme
Pour chaque option du menu, le choix de l'utilisateur amène le programme à
réaliser les opérations suivantes :
- Saisir au clavier la classe à explorer.
- 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.
- Afficher les noms de toutes les interfaces implémentées par la classe.
- 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
.
- Créer un objet de la classe. Il faudra prendre soin du passage d'éventuels
paramètres au constructeur.
- 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.
- 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 :
- une présentation générale du programme réalisé,
- la liste des classes et les liens entre ces classes (héritage, implémentation),
- une analyse succinte des principaux problèmes à résoudre,
- le listing des fichiers de l'application.
La soutenance consiste en :
- la remise du compte-rendu,
- la présentation de l'application réalisée,
- une démonstration,
- expliquer quelques extraits du code choisis par celui qui effectue la recette.