TD3 - Chargement dynamique

De $1

Version de 22:07, 19 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écialisera (la classe SecureClassLoader. et surchargera la méthode loadClass. On pourra par exemple compléter le code donné ci-dessous:

package miage.m1.dynamicLoading;

public class MyClassLoader extends SecureClassLoader {
 private ArrayList<File> path = new ArrayList<File>();

 @Override
 protected Class<?> findClass(String name) throws ClassNotFoundException {
  byte[] b = loadClassData(name);
  return super.defineClass(name, b, 0, b.length);
 }

 private byte[] loadClassData(String name) throws ClassNotFoundException {
  // TODO A COMPLETER 
 }
}

Le nom de classe donné est le nom qualifié (par exemple: miage.m1.MaClasse). Il s'agit alors de parcourir pour 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[].

Attention ! La classe miage.m1.MaClasse doit nécessairement être définie dans une hiérarchie de fichiers différentes que celle dans laquelle la classe ClasseLoader est développée (c'est-à-dire un projet différent si vous êtes sous Eclipse ou Netbeans).

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.