Динамическая модификация пути к классам в Java: подробное руководство
При разработке приложений Java может возникнуть необходимость в динамическом изменении пути к классам. Эта возможность позволяет добавлять или удалять файлы JAR из среды выполнения пути к классам, позволяя загружать дополнительные библиотеки или настраивать поведение приложения на лету.
Прежде чем продолжить
Вы можете задаться вопросом, зачем нужно динамически изменять путь к классам. Один из распространенных сценариев возникает при использовании Clojure REPL (цикл чтения-оценки-печати), когда вам может потребоваться загрузить дополнительные файлы JAR в путь к классам для доступа к определенным исходным файлам Clojure. Эта необходимость возникает без перезапуска Clojure, особенно при использовании его со Slime на Emacs.
Изменение пути к классам в Java 9 и более поздних версиях
В Java 9 и последующих версиях добавление JAR-файлы в путь к классам требуют использования API инструмента и агента Java. Вы можете указать встроенный агент в манифесте файла запуска/основного jar-файла, используя атрибут «Launcher-Agent-Class». начиная с Java 9, система java.lang.ClassLoader больше не является экземпляром java.net.URLClassLoader. Это изменение требует использования альтернативных подходов, таких как java.lang.ModuleLayer, чтобы влиять на путь к модулю вместо пути к классам.
Динамическая модификация пути к классам для Java 8 и более ранних версий
Для Java 8 и более ранних версий изменение пути к классам включает создание нового ClassLoader. Вот несколько ключевых моментов, которые следует учитывать:
Невозможно напрямую изменить системный путь к классам переносимым способом. Вместо этого вам необходимо определить собственный ClassLoader.
ClassLoader работает иерархически, поэтому классы, ссылающиеся друг на друга, должны загружаться из одного и того же или дочернего ClassLoader.Рассмотрите возможность использования URLClassLoader для расширения текущего ClassLoader вместо создания своего собственного.ClassLoader currentThreadClassLoader = Thread.currentThread().getContextClassLoader(); // Добавляем каталог «conf» в путь к классам URLClassLoader urlClassLoader = новый URLClassLoader(новый URL[]{новый файл("conf").toURL()}, currentThreadClassLoader); // Заменяем загрузчик классов потока Thread.currentThread().setContextClassLoader(urlClassLoader);
Вы также можете добиться этого с помощью отражения, как показано в фрагменте кода ниже:public void addURL(URL url) throws Исключение {
URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Класс clazz = URLClassLoader.class;
// Используем отражение, чтобы добавить URL в загрузчик классов
Метод метод = clazz.getDeclaredMethod("addURL", новый класс[]{URL.class});
метод.setAccessible(истина);
метод.invoke(classLoader, новый объект[]{url});
}
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3