package platform.ClassManager; /** * ClassLoader that can load classes from a jar file * Allows to find a class (by its name) in a jar file * * @author Dalmau */ public class ClassLoaderFromJarFile extends ClassLoader { private String jarFileName; // fichier jar utilise private int liens; // nombre de CM qui utilisent ce fichier (permet de savoir quand on n'en a plus besoin) /** * Cretes a class loader that finds the classes into a jar file * @param parent the parent class loader * @param jarName the name of the jar file */ public ClassLoaderFromJarFile(ClassLoader parent, String jarName) { super(parent); liens = 0; jarFileName = jarName; } /** * In order to remove the jar file when not in use, each BC using the file * is added as linked. When no BC is linked the jar file can be destroyed */ public synchronized void addLink() { System.out.println("ajout de lien sur "+jarFileName); liens++; } // un CM supplementaire utilise ce fichier jar /** * Returns the jar file name used by this class loader * @return the jar file name used by this class loader */ public String getJarFileName() { return jarFileName; } /** * When no BC is linked the jar file can be destroyed */ public synchronized void deleteJarFile() { liens--; // diminuer le nombre de CM utilisant ce fichier jar if (liens <= 0) { // s'il n'en reste plus on peut le supprimer de la liste KalimuchoClassLoader.removeClassLoader(this); } } /** * Overrides the load class method in order to load a class from a jar file * @param name name of the class to load * @return the loaded class * @throws ClassNotFoundException if the class not exist in the jar file */ @Override public Class<?> loadClass(String name) throws ClassNotFoundException { // surcharge de le methode load class pour trouver les classes avec ce ClassLoader try { // essayer de trouver la classe avec le classLoader de base de la PF Class<?> recu = super.loadClass(name); // renvoyer le Class correspondant return recu; } catch (ClassNotFoundException cnfe) { // le classLoader de base de la PF ne trouve pas la classe byte[] code = null; JarRessources jarRessources = new JarRessources (jarFileName); // chercher dans le fichier jar code = jarRessources.getRessource("classes/"+name.replace('.', '/')+".class"); if (code != null) { // la classe demandee est dans le jar Class<?> recu = defineClass(name, code, 0, code.length); return recu; // renvoyer le Class correspondant } else { // la classe demandee n'est pas dans le jar throw new ClassNotFoundException(); } } } }