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.
1.a) 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.
1.b) 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.