2010-04-10 11 views
6

Gibt es eine ClassLoader-Implementierung, die ich verwenden kann, um Klassen aus einem InputStream zu laden?Wird von JAR als InputStream geladen?

Ich versuche, ein JAR, für das ich einen InputStream habe, in einen neuen ClassLoader zu laden.

Antwort

6

Dies ist unwahrscheinlich, wie Sie feststellen werden, wenn Sie versuchen, es selbst zu tun. Sie können nicht zufällig auf InputStream zugreifen, um Klassen nach Bedarf abzurufen. Daher müssen Sie den Inhalt im Arbeitsspeicher oder im Dateisystem zwischenspeichern.

Wenn Sie auf der Festplatte zwischenspeichern, verwenden Sie einfach .

Wenn Sie im Speicher zwischenspeichern, müssen Sie eine Art von Map mit JarInputStream erstellen und dann ClassLoader (übersteuern die entsprechenden Methoden) zu erweitern. Der Nachteil dieses Ansatzes ist, dass Sie Daten im Arbeitsspeicher unnötig speichern.

0

Ich weiß, das ist nicht wirklich eine Antwort auf Ihre Frage zu JAR/InputStream. Aber folgende kann eine alternative Lösung zu dem sein, was Sie erreichen möchten. Hier ist ein Code, der dem Klassenpfad eine URL hinzufügt.

Sie einen java.io.File zu URL als umwandeln f.toURI().toURL()

/** 
* Adds a URL to current classpath. 
* @param url url 
*/ 
public static void addURL(URL u) {  
    URLClassLoader sysloader = (URLClassLoader)ClassLoader.getSystemClassLoader(); 
    try { 
     Method method = URLClassLoader.class.getDeclaredMethod("addURL",parameters); 
     method.setAccessible(true); 
     method.invoke(sysloader,new Object[]{u}); 
     System.out.println("Dynamically added " + u.toString() + " to classLoader"); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
}