2013-03-05 4 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

Надеется, что вы можете помочь!

Привет,

Martin

+0

JSonEditor или редактор отдела? Это смущает. –

+0

Извините за это, я имею в виду SubEditor. Обновлено мое описание –

ответ

3

Это может быть, что эти два класса загружаются с использованием различных экземпляров ClassLoader.

Я думаю, вы можете проверить, если это так, сравнивая два класса погрузчиков:

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

Использование различных результатов загрузчики классов в двух разных Class объектов, следовательно ClassCastException

+0

На самом деле, вы правы. Но как это могло быть? Оба класса находятся в одной и той же runnable, созданной Eclipse. У меня никогда не было таких проблем при разработке под Netbeans ... –

+0

Я не уверен, возможно, если бы вы могли опубликовать более подробную информацию, это было бы более ясно. Что касается решения вашей проблемы, это похоже на «Editor.getClassLoader(). LoadClass (« bla.SubEditor »)' вместо '(Editor) ClassLoader.getSystemClassLoader(). LoadClass (« bla.SubEditor »)' должен работать –

+0

Хорошо, спасибо! Я понял, что в eclipse используется загрузчик классов 'java.net.URLClassLoader', тогда как система ClassLoader является экземпляром' sun.misc.Launcher.AppClassLoader'. Большое спасибо; но это также означало бы, что я мог бы загружать 2 класса с тем же именем (например, в 2 раза больше класса 'bla.SubEditor') разными загрузчиками классов? –

Смежные вопросы