Добавление JAR-файла в classpath во время выполнения без уловок отражения - PullRequest
1 голос
/ 02 февраля 2012

Есть несколько постов о том, как добавить jar-файл в classpath во время выполнения с помощью следующей идеи: - получить текущий путь к классу системы; - предположим, что это URLClassLoader; - использовать отражение для установки доступа к защищенному методу addURL; - используйте указанный метод для добавления URL-адреса в classpath.

Вот пример: Добавление файлов в путь к классам Java во время выполнения

Из-за 2 и 3 шагов это выглядит как "мерзкий взлом".

Как я могу расширить URLClassLoader и установить его как текущий? Я немного запутался с загрузчиками классов и попробовал следующее:

public static void main(String... args) {
    URLClassLoader loader = new URLClassLoader(new URL[]{new URL("file:jxl.jar")});
    System.out.println(loader.loadClass("jxl.Workbook"));
    Thread.currentThread().setContextClassLoader(loader);
    System.out.println(Class.forName("jxl.Workbook"));
} // main

В четвертой строке я получаю ClassNotFoundException, а вторая работает нормально. (почему это так, кстати?)

1 Ответ

2 голосов
/ 02 февраля 2012

Метод Class.forName использует «определение загрузчика класса текущего класса», а не загрузчик класса контекста потока. В вашем случае ClassLoader, который будет использовать Class.forName, будет загружать ваше приложение, то есть системный загрузчик классов . Это загрузчик классов, который ищет ресурсы в пути к классам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...