2013-03-05 91 views
1

我有2個類:SubEditor和Editor。上傳時出現ClassCastException

public class SubEditor extends Editor {

我創建一個副主編對象,並試圖將其轉換爲編輯器,但我會得到一個ClassCastException:

try { 
    (Editor) ClassLoader.getSystemClassLoader().loadClass("bla.SubEditor").newInstance(); 
} catch (Exception ex) { 
    try { 
     Object object = ClassLoader.getSystemClassLoader().loadClass("bla.SubEditor").newInstance(); 

     // prints "false": 
     System.out.println(object instanceof Editor); 

     // prints "bla.SubEditor": 
     System.out.println(object.getClass().getCanonicalName()); 

     // prints "Super: bla.Editor": 
     System.out.println("Super: "+object.getClass().getSuperclass().getCanonicalName()); 
    } catch (Exception e) { 
     // do sth 
    } 
} 

這怎麼可能,我得到「假」上「SubEditor instanceof Editor」?

例外:

java.lang.ClassCastException: bla.SubEditor cannot be cast to bla.Editor

希望能幫到你!

問候,

馬丁

+0

JSonEditor或副主編?這很混亂。 – 2013-03-05 18:22:51

+0

對不起,我的意思是SubEditor。更新我的描述 – 2013-03-05 18:24:05

回答

3

它可能是,這兩個類是利用不同的ClassLoader實例裝載。

我想你可以檢查,如果這是通過比較兩個類加載器的情況下:

Editor.getClassLoader().equals(ClassLoader.getSystemClassLoader()) 

在兩個不同的Class對象使用不同的類加載器的效果,因此ClassCastException

+0

事實上,你是對的。但它怎麼會是?這兩個類都是由Eclipse創建的相同的可運行的。在Netbeans下開發時,我從來沒有遇到過這樣的問題...... – 2013-03-05 18:30:39

+0

我不確定,也許如果你可以發佈更多的細節,它會更清楚。至於解決你的問題,看起來像'Editor.getClassLoader()。loadClass(「bla.SubEditor」)'而不是'(編輯器)ClassLoader.getSystemClassLoader()。loadClass(「bla.SubEditor」)'應該工作 – 2013-03-05 18:35:03

+0

好的,謝謝! 我想通了,eclipse使用類加載器'java.net.URLClassLoader',而系統ClassLoader是'sun.misc.Launcher.AppClassLoader'的一個實例。非常感謝你;但是這也意味着我可以用不同的類加載器加載2個具有相同名稱的類(例如class Blazer的2倍)? – 2013-03-05 18:39:43

相關問題