TD3 - Chargement dynamique

De $1

Version de 03:09, 26 Avr 2024

cette version.

Revenir à liste des archives.

Voir la version actuelle

Ce TP a pour objectif d'étudier les mécanismes de chargement dynamique en Java et en particulier le fonctionnement de la classe ClassLoader.

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, line 1, column 583: invalid Primary

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.

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 JarFile et ZipFile 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 JFrame
  • Y ajouter une barre de menu (JMenuBar) et un menu "dynamic"
  • Ajouter dans le menu "dynamic" un sous-menu pour chaque classe de type 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.

/div[3]/p[3]/span, reference to undefined name 'syntax'