2011-05-15 48 views
1

我使用下面的代碼動態加載在Java類:NoClassDefFoundError的與Java反射

URL url = new File(ACTIONS_PATH).toURI().toURL(); 
URLClassLoader clazzLoader = new URLClassLoader(new URL[]{url}); 
Class<RatingAction> clazz = (Class<RatingAction>) clazzLoader.loadClass(name); 
return clazz.newInstance(); 

該代碼可以使用簡單類(沒有繼承或接口),但我想加載類是實現一個接口(該類加載器可以使用findClass找到) 當我調用class.newInstance時,我得到了提到的異常。 我在做什麼錯?

謝謝。

+0

我不知道你的問題,而是寫'類',你應該加載類'RatingAction',但這種類型必須是已經加載爲你寫這個。你的意思是'Class <?擴展RatingAction>'? – 2011-05-15 13:25:06

+0

我能夠通過簡單的使用'Class.forname(name).newInstance'來繞過這個問題,但我很樂意理解爲什麼原始代碼不起作用 – 2011-05-15 13:26:53

+0

因爲這次你沒有使用自定義cloassloader。 – Tarlog 2011-05-15 13:28:04

回答

2

你的類路徑有問題。我猜這是因爲你沒有定義父類加載器 - 「url」是否包含所有需要的類,包括系統類?

當類實際上已解析時,您會得到異常,因此出現在已加載類中的類也將被加載。如果將clazzLoader.loadClass(name)更改爲clazzLoader.loadClass(name, true),則會在loadClass行中得到異常。

嘗試以下操作:

URL url = new File(ACTIONS_PATH).toURI().toURL(); 
URLClassLoader clazzLoader = new URLClassLoader(new URL[]{url}, getClass().getClassLoader()); 
Class<RatingAction> clazz = (Class<RatingAction>) clazzLoader.loadClass(name); 
return clazz.newInstance(); 
+0

謝謝,這很好用 – 2011-05-15 13:40:00