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; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.security.SecureClassLoader; import java.util.ArrayList; import java.util.jar.JarFile; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class MyClassLoader extends SecureClassLoader { private ArrayList<File> path = new ArrayList<File>(); public MyClassLoader(File classPath) { super(); addPath(classPath); } public void addPath(File classPath) { if (!classPath.exists()) throw new IllegalArgumentException(classPath+" does not exist!"); this.path.add(classPath); } @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 { ... } }
package miage.m1.dynamicLoading; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.security.SecureClassLoader; import java.util.ArrayList; import java.util.jar.JarFile; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class MyClassLoader extends SecureClassLoader { private ArrayList<File> path = new ArrayList<File>(); public MyClassLoader(File classPath) { super(); addPath(classPath); } public void addPath(File classPath) { if (!classPath.exists()) throw new IllegalArgumentException(classPath+" does not exist!"); this.path.add(classPath); } @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 { ... } }