Ce TP a pour objectif d'étudier les mécanismes de chargement dynamique en Java et en particulier le fonctionnement de la classe ClassLoader8
.
MyClassLoader
On veut créer son propre ClassLoader
qui cherche les classes à charger dans une liste de répertoires ou de ressources compressées (jar, zip). Pour cela vous devez créer une classe MyClassLoader
qui spécialise la classe SecureClassLoader
et surcharge la méthode loadClass
. On pourra par exemple compléter le code donné ci-dessous:
/div/p[2]/span, reference to undefined name 'syntax'
Le nom de classe donné est le nom qualifié (par exemple: miage.m1.MaClasse
). Il s'agit alors de parcourir chaque chemin dans la liste path
, pour chercher la présence d'un dossier miage
qui contient un dossier m1
qui contient un fichier MaClasse.class
. Il faut alors lire tout le contenu de ce fichier pour extraire un tableau de type byte[]
(avec la méthode read()
de InputStream
, par exemple).
Attention ! La classe miage.m1.MaClasse
doit nécessairement être définie dans une hiérarchie de fichiers différente de celle dans laquelle la classe ClasseLoader
est développée (c'est-à-dire un projet différent si vous êtes sous Eclipse ou Netbeans). Le répertoire en question ne doit PAS être dans le CLASSPATH utilisé pour exécuter votre programme de test.
Pour tester votre programme il faut se souvenir qu'il ne faut pas appeler la méthode findClass
directement. C'est d'ailleurs la plupart du temps impossible car elle est protected. Voir le cours9. Un projet Maven est disponible sur GitHub (https://github.com/fabricehuet/testmyclassloader10 ). Il contient quelques tests simples pour vérifier que votre ClassLoader fonctionne.
Seulement des répertoires
Dans un premier temps on supposera que les fichiers présents dans la liste path
sont des dossiers. Utiliser la méthode isDirectory()
pour s'en assurer le cas échéant.
Fichiers archives
Dans un second temps, on considérera que les fichiers présents dans la liste path
peuvent également représenter des fichiers archives (.jar ou .zip). On utilisera alors les classes JarFile11
et ZipFile12
pour extraire les fichiers .class des archives.
Repository
On veut maintenant pouvoir charger toutes les classes qui se trouvent dans un répertoire donné. On utilisera pour faire le chargement, la classe MyClassLoader
développée à l'exercice précédent.
Toutes les classes
Dans un premier temps, on chargera et renverra toutes les classes correspondant à un fichier .class, sans discrimination.
On pourra par exemple compléter la classe Repository
ci-dessous.
/div[2]/div[2]/p[2]/span, reference to undefined name 'syntax'
Seulement les classes héritant de T
Dans un deuxième temps, on renverra uniquement les classes héritant d'un type donné
On pourra par exemple compléter la classe Repository
ci-dessous.
/div[2]/div[2]/div[2]/div/p[2]/span, reference to undefined name 'syntax'
Menu
Pour tester vos classes:
- Créer une fenêtre
JFrame13
- Y ajouter une barre de menu (
JMenuBar14
) et un menu "dynamic" - Ajouter dans le menu "dynamic" un sous-menu pour chaque classe de type
Action15
que vous trouverez dans un repository à définir et à remplir par vos soins.
La classe Java ci-dessous créé une fenêtre et y ajoute un menu statiquement. A vous de la modifier pour y ajouter un menu dynamiquement selon les instructions données plus haut.
/div[3]/p[3]/span, reference to undefined name 'syntax'
Notes de bas de page
1 http://miageprojet2.unice.fr/User:FredericMallet/Programmation_Avanc%c3%a9e_-_2012%2f%2f2013/TD3_-_Chargement_dynamique#MyClassLoader
2 http://miageprojet2.unice.fr/User:FredericMallet/Programmation_Avanc%c3%a9e_-_2012%2f%2f2013/TD3_-_Chargement_dynamique#Seulement_des_r.c3.a9pertoires
3 http://miageprojet2.unice.fr/User:FredericMallet/Programmation_Avanc%c3%a9e_-_2012%2f%2f2013/TD3_-_Chargement_dynamique#Fichiers_archives
4 http://miageprojet2.unice.fr/User:FredericMallet/Programmation_Avanc%c3%a9e_-_2012%2f%2f2013/TD3_-_Chargement_dynamique#Repository
5 http://miageprojet2.unice.fr/User:FredericMallet/Programmation_Avanc%c3%a9e_-_2012%2f%2f2013/TD3_-_Chargement_dynamique#Toutes_les_classes
6 http://miageprojet2.unice.fr/User:FredericMallet/Programmation_Avanc%c3%a9e_-_2012%2f%2f2013/TD3_-_Chargement_dynamique#Seulement_les_classes_h.c3.a9ritant_de_T
7 http://miageprojet2.unice.fr/User:FredericMallet/Programmation_Avanc%c3%a9e_-_2012%2f%2f2013/TD3_-_Chargement_dynamique#Menu
8 http://download.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html
9 http://miageprojet2.unice.fr/@api/deki/files/1399/=02_Chargement_dynamique.pdf
10 https://github.com/fabricehuet/testmyclassloader
11 http://download.oracle.com/javase/6/docs/api/java/util/jar/JarFile.html
12 http://download.oracle.com/javase/6/docs/api/java/util/zip/ZipFile.html
13 http://download.oracle.com/javase/6/docs/api/javax/swing/JFrame.html
14 http://download.oracle.com/javase/6/docs/api/javax/swing/JMenuBar.html
15 http://download.oracle.com/javase/6/docs/api/javax/swing/Action.html