1

我想在目录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");
4

1 回答 1

4

包名是完整类名的一部分,而不是类路径项,因此您需要以下内容:

URL[] urls = {new URL("file:/F:/badge-dao/bin")}; 
...
selectedClass = classLoader.loadClass("com.badge.dao.impl.BadgeDaoImpl"); 

在您的原始代码中,类加载器可以找到一个名为BadgeDaoImpl.classin的文件file:/F:/badge-dao/bin/com/badge/dao/impl/,但它的完整类名 ( com.badge.dao.impl.BadgeDaoImpl) 与请求的 () 不匹配BadgeDaoImpl,因此类加载器会抛出一个NoClassDefFoundError. 由于您只是在捕捉ClassNotFoundException,因此看起来控制权悄悄地传递给了该finally块。当您更改文件夹或类名称以致.class找不到该文件时,ClassNotFoundException会按预期抛出。

于 2011-03-23T09:24:09.380 回答