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.
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.
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.
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();
}
}