Oui, c’est un peu plus compliqué: les url de URLClassLoader te permet simplement de retrouver le classpath paramétré pour ta JVM, mais si tu connaît le chemin d’accès de on jar, tu n’es pas obligé de passer par là.
La partie difficile, c’est d’avoir la liste des noms de classes à ouvrir si tu ne la connaît pas, c’était le but de l’autre topic.
Un fois que tu as le nom de la classe, il te suffit de récupérer l’objet “java.lang.Class” par clazz =Class.forName(classname). et cet objet te permet d’instancier de nouveaux objets simplement par clazz.newInstance().
Edit: il y a une astuce pour ne pas passer par le ClassLoader et obtenir le nom de jar d’un package, en utilisant:
http://java.sun.com/j2se/1.4.2/docs/api/ja…va.lang.String)
URL url = this.getClass().getResource("/"+packageName.replace('.','/'));
if (url == null){
return "not found";
}
if (traceJar) LogManager.trace(packageName + " is loaded from "+url);
if (! url.getProtocol().equals("jar")){
return "not a jar";
}
int a=url.getPath().indexOf('!');
// (ie extract the name between file:/D:/ and !
String jarfile = url.getPath().substring(5,a);
//open the jar file, the manifest and then use the values we need
Manifest man = loadManifest(jarfile);
et avec un fonction qui retourne simplement le manifest (tu n’en a pas besoin, mais ça utilise un JarFile dont tu aura besoin si tu veux parcourir des clases
/**
* Returns the Manifest for the specified JAR file name.
* @see class Package
*/
protected static Manifest loadManifest(String fn) {
try {
FileInputStream fis = new FileInputStream(fn);
JarInputStream jis = new JarInputStream(fis, false);
Manifest man = jis.getManifest();
jis.close();
return man;
} catch (IOException e) {
return null;
}
}