我想在目录 F:/ badge-dao / bin / com / badge / dao / impl / 中加载一个名为 BadgeDaoImpl 的文件。我正在编写并测试以下代码。
如果我更改目录或类名,则会引发异常。对于下面的代码,我认为它应该工作,它不会抛出一个classNotFoundException,而是暂停并将控件带到EventTable的finally块。
你能告诉我在哪里弄错了。
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");
答案 0 :(得分:4)
包名称是完整类名的一部分,而不是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
。