2011-03-23 26 views
1

我想加载一个文件中的目录F:/徽章道/斌/ COM /徽章/刀/ IMPL/,命名为BadgeDaoImpl。我正在编写和测试下面的代码。URLClassLoader的工作不

如果我更改目录或类名称,它会引发异常。对于我认为应该工作的以下代码,它不会抛出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"); 
+3

你确定'bin'不是*你的真实classpath目录,你真的想加载'com.badge.dao.impl.BadgeDaoImpl'吗?另外,你在说什么'finally'块? – Bombe 2011-03-23 09:05:20

+0

是的,我正在开发一个eclipse插件,它不是插件的bin,而是工作区中所选项目的bin文件夹。所以,我想这不是包含在默认类加载器中的类路径,但我没有很多ClassLoading的经验。 – user668441 2011-03-23 09:16:07

回答

4

包名是完整的类名称,而不是类路径项目的一部分,所以你需要以下条件:

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

在你的原始代码的类加载器可以找到一个在file:/F:/badge-dao/bin/com/badge/dao/impl/名为BadgeDaoImpl.class文件,但其全班名称(com.badge.dao.impl.BadgeDaoImpl)与请求的名称不匹配(BadgeDaoImpl),因此classloader会抛出NoClassDefFoundError。由于您仅捕获了ClassNotFoundException,因此控制权似乎会悄无声息地传递到finally区块。当您更改文件夹或类名称以便.class文件无法找到时,ClassNotFoundException按预期抛出。