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 брошен как ожидалось.

Другие вопросы по тегам