2011-03-23 60 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按預期拋出。