2010-04-10 18 views
6

Czy istnieje implementacja ClassLoader, której mogę użyć do załadowania klas z obiektu InputStream?Ładowanie z JAR jako InputStream?

Próbuję załadować plik JAR, dla którego mam InputStream do nowej ClassLoader.

Odpowiedz

6

Jest to mało prawdopodobne, ponieważ znajdziesz, jeśli spróbujesz zrobić to samemu. Nie będzie można uzyskać losowego dostępu do klasy InputStream w celu wyszukania klas, ponieważ są one wymagane, więc będziesz musiał buforować zawartość w pamięci lub w systemie plików.

Jeśli buforujesz na dysku, po prostu użyj URLClassLoader.

Jeśli buforujesz w pamięci, musisz utworzyć coś w rodzaju Map z JarInputStream, a następnie przedłużyć ClassLoader (nadpisując odpowiednie metody). Minusem tego podejścia jest niepotrzebne przechowywanie danych w pamięci RAM.

0

Wiem, że to nie jest odpowiedź na twoje pytanie dotyczące JAR/InputStream. Ale następujące może być alternatywne rozwiązanie tego, co próbujesz osiągnąć. Oto kod, który doda adres URL do ścieżki klas.

można przekonwertować java.io.File do URL jak 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(); 
    } 
}