Ce TP a pour objectif d'étudier les mécanismes de chargement dynamique en Java et en particulier le fonctionnement de la classe ClassLoader
.
L'URLClassLoader est un classloader standard en Java qui permet de préciser un ou plusieurs chemins où trouver une classe. Il supporte les répertoires mais aussi les fichiers jar.
Créer 2 projets dans votre IDE et dans le premier créez une classe Test
. Dans le deuxième, créez une classe Main qui essaie de charger la classe du premier projet et échoue. Quelle est l'exception levée ?
Dans la classe Main, créez un URLClassLoader et spécifiez le chemin permettant de trouver la classe du premiere projet. Vérifiez que cela fonctionne.
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:
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 cours. Un projet Maven est disponible sur GitHub (https://github.com/fabricehuet/testmyclassloader ). Il contient quelques tests simples pour vérifier que votre ClassLoader fonctionne.
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.
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 JarFile
et ZipFile
pour extraire les fichiers .class des archives.
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.
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.
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.
Pour tester vos classes:
JFrame
JMenuBar
) et un menu "dynamic"Action
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.