URLClassLoader не работает
Я хочу загрузить файл в каталог F:/badge-dao/bin/com/badge/dao/impl/ с именем BadgeDaoImpl. Я пишу и тестирую следующий код.
Если я изменю каталог или имя класса, он выдаст исключение. Для следующего кода, который, как я полагаю, должен работать, он не генерирует исключение classNotFoundException, а скорее останавливает его и передает управление блоку finally EventTable.
Можете ли вы сказать мне, где я получаю это неправильно.
URL[] urls = {new URL("file:/F:/badge-dao/bin/com/badge/dao/impl/")};
ClassLoader parentClassLoader = project.getClass().getClassLoader();
URLClassLoader classLoader = new URLClassLoader(urls, parentClassLoader);
selectedClass = classLoader.loadClass("BadgeDaoImpl");
1 ответ
Имя пакета является частью полного имени класса, а не элемента classpath, поэтому вам необходимо следующее:
URL[] urls = {new URL("file:/F:/badge-dao/bin")};
...
selectedClass = classLoader.loadClass("com.badge.dao.impl.BadgeDaoImpl");
В вашем оригинальном коде загрузчик классов может найти файл с именем BadgeDaoImpl.class
в file:/F:/badge-dao/bin/com/badge/dao/impl/
, но его полное имя класса (com.badge.dao.impl.BadgeDaoImpl
) не соответствует запрошенному (BadgeDaoImpl
), поэтому загрузчик классов бросает NoClassDefFoundError
, Так как вы ловите только ClassNotFoundException
Похоже, что управление бесшумно переходит к finally
блок. Когда вы меняете имена папок или классов так, чтобы .class
файл не может быть найден, ClassNotFoundException
брошен как ожидалось.