Загрузка из JAR в качестве InputStream? - PullRequest
6 голосов
/ 10 апреля 2010

Есть ли реализация ClassLoader, которую я могу использовать для загрузки классов из InputStream?

Я пытаюсь загрузить JAR, для которого у меня есть InputStream, в новый ClassLoader.

Ответы [ 2 ]

6 голосов
/ 10 апреля 2010

Это маловероятно, поскольку вы обнаружите, если попытаетесь сделать это самостоятельно. Вы не сможете получить произвольный доступ к InputStream для поиска классов по запросу, поэтому вам придется кэшировать содержимое либо в памяти, либо в файловой системе.

Если вы кэшируете на диске, просто используйте URLClassLoader .

Если вы кешируете в памяти, вам нужно создать какой-то Map с JarInputStream , а затем расширить ClassLoader (переопределяя соответствующие методы). Недостатком этого подхода является то, что вы храните данные в ОЗУ без необходимости.

0 голосов
/ 10 апреля 2010

Я знаю, что это не совсем ответ на ваш вопрос относительно JAR / InputStream. Но следование может быть альтернативным решением того, чего вы пытаетесь достичь. Вот некоторый код, который добавит URL к classpath.

Вы можете преобразовать java.io.File в URL как 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();
    }
}
...