Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ClassLoader и приведение типов 
:(
    Опции темы
0xBA0BAB
Дата 31.3.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 31.3.2008

Репутация: нет
Всего: нет



Здравствуйте, многоуважаемые коллеги!
Возникла необходимость реализовать свой ClassLoader. Реализовал. Лоадит. Инстанциирует. А вот результат инстанциирования не приводится к искомому классу  smile 
Ничего н емогу понять. Вот кусок кода:
Код

        try
        {
            Object o = classLoader.findClass("Serie").newInstance();
            System.out.println("Try serie. Catch "+o.getClass().getName());    // Здесь печатается "Serie", т.е. все как бы правильно.
            return (Serie)o;    // А здесь эксепшен InvalidCastException
        }
        catch (InstantiationException e)
        {
            System.err.println("Unable to instantiate Serie: "+e.getMessage());
            return null;
        }
        catch (IllegalAccessException e)
        {
            System.err.println("Unable to access Serie: "+e.getMessage());
            return null;
        }


Отладчиком смотрю объект "о" - ну все правильно, тот самый объект, который и ожидался. Правильно проиннициализирован, отладчиу даже тоже пишет, что это экземпляр класса Serie. Но стоит только дойти до строки "return (Serie)o;" как вываливается эксепшен. Ничего понять не могу. Коллеги, выручайте!

P.S. Если не выделываться с ClassLoader, просто сделать new Serie() , все проходит нормально. КлассЛоадер сам по себе никаких эксепшенов не выдает, как уже говорил, создается все правильно.
PM MAIL   Вверх
Kangaroo
Дата 31.3.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


AA - Aussie Animal
****


Профиль
Группа: Участник Клуба
Сообщений: 2042
Регистрация: 7.10.2006
Где: US

Репутация: 21
Всего: 104



Цитата(0xBA0BAB @  31.3.2008,  16:33 Найти цитируемый пост)
эксепшен InvalidCastException

А что за ИнвалидКастИксепшн? Где такой взял? ClassCastException or InvalidClassException?


--------------------
Lost....
PM MAIL MSN   Вверх
LSD
Дата 31.3.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Классы загруженные разными класслоадерами считаются различными и каст объектов между ними невозможен.

В твоем случае есть два класса, один загруженный твоим класс лоадером, а второй умолчальным класслоадером.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
0xBA0BAB
Дата 31.3.2008, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 31.3.2008

Репутация: нет
Всего: нет



java.lang.ClassCastException

LSD, а как подменить умолчальный? Умолчальный не сможет загрузить нужный класс. Собственно, зачем-то собственные класслоадеры придумали, как то ими все же пользуются?
PM MAIL   Вверх
LSD
Дата 31.3.2008, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(0xBA0BAB @  31.3.2008,  19:08 Найти цитируемый пост)
Умолчальный не сможет загрузить нужный класс. Собственно, зачем-то собственные класслоадеры придумали, как то ими все же пользуются?

Thread.setContextClassLoader(), но вообще-то если умолчальный не сможет загрузить все классы объявленные в сигнатуре метода, то и сам метод вызван не будет.

Т.е. судя по это строчке
Код

return (Serie) o;

метод возвращает Serie и значит этот класс вполне успешно загружен умолчальным класс лоадером.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
0xBA0BAB
Дата 31.3.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 31.3.2008

Репутация: нет
Всего: нет



Это я так хочу, чтобы он возвращался... smile Спасибо за наводку, утром попробую
PM MAIL   Вверх
SID_M
Дата 26.8.2009, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 11.2.2005
Где: Россия, г. Москва

Репутация: нет
Всего: нет



Очевидно, что эта тема - дела минувших дней. 
Однако всё же интересно, как была решена проблема?
Просто всё в жизни повторяется. У меня есть свой 
Код
ClassLoader
, который загружает классы из указанной директории, но в качестве необходимых для работы классов из той директории указываются классы моего рабочего проекта. (Так реализуются внешние модули, которые можно подключать другим программистам к моей системе). Поэтому загрузка идет примерно так:
Код

    protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
        /* Сначала ищем класс среди уже загруженных в систему */
        Class c = findLoadedClass(name);

        /* Если не нашли, то пробуем загрузить класс из системных */
        if (c == null) {
            try {
                c = findSystemClass(name);
            } catch (Exception e) {
            }
        }

        /* Если до этого класс не загружен, то пробуем загрузить его сначала из конекста системы
           с использованием загрузчика по-умолчанию. В нашем случае это будет WebApplicationClassLoader */
        if (c == null) {
            try {
                c = Thread.currentThread().getContextClassLoader().loadClass(name);
            } catch (Exception e){
            }
        }

        /* Если до этого класс не загружен, то загружаем его из указанной директории */
        if (c == null) {
            String filename = name.replace('.', File.separatorChar) + ".class";

            try {
                byte data[] = loadClassData(filename);
                c = defineClass(name, data, 0, data.length);
                if (c == null) {
                    throw new ClassNotFoundException(name);
                }
            } catch (IOException e) {
                throw new ClassNotFoundException("Ошибка чтения файла: " + filename);
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }

Отсюда получается, что все классы, которые относятся к внешнему модулю грузятся моим ClassLoader-ом, а классы-предки внешних модулей, грузятся стандартным загрузчиком. 
Когда всё это дело дальше проверяется:
Код

    public int execute(ExternalModuleDescriptor moduleDescriptor) {
        try {
            FileClassLoader classLoader = new FileClassLoader(moduleDescriptor.getModuleRoot());
            Class<?> loadedClass = classLoader.loadClass(moduleDescriptor.getMainClass());
            if (isContainExternalModule(loadedClass)) {
                ExternalModule module = loadedClass.cast(new DefaultExternalModule());
                return module.run();
            }
        } catch (ExternalModuleException ex) {
            Logger.getLogger(DefaultExternalModuleManager.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DefaultExternalModuleManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        return DefaultExternalModule.EXECUTION_RESULT_OTHER_ERROR;
    }

То преобразование типов не идет, нифига. 
Что подскажете?
--------------------
Если тебе не дано летать, то хотя бы ползай с гордо поднятой головой.
PM MAIL ICQ Skype GTalk   Вверх
LSD
Дата 26.8.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Меня смущает строчка:
Код

c = Thread.currentThread().getContextClassLoader().loadClass(name);


Ты хочешь сказать, что твой ClassLoader не установлен как ContextClassLoader для этого модуля?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
SID_M
Дата 26.8.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 11.2.2005
Где: Россия, г. Москва

Репутация: нет
Всего: нет



Нет, не установлен. Ибо речь тут идет о Web приложении, в каждом конкретном случае я не знаю откуда достать классы исполняемого приложения, но я точно знаю, где будут лежать внешние модули. Мой ClassLoader загружает классы в зависимости от директории.

--------------------
Если тебе не дано летать, то хотя бы ползай с гордо поднятой головой.
PM MAIL ICQ Skype GTalk   Вверх
SID_M
Дата 26.8.2009, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 195
Регистрация: 11.2.2005
Где: Россия, г. Москва

Репутация: нет
Всего: нет



Так, народ, вопрос снимается. Там была детская ошибка при преобразовании типов. 
Кстати рассуждения по поводу того, что если разные ClassLoader-ы загрузили классы, и они друг к другу не приводятся себя не подтвердили. 
К счастью...

--------------------
Если тебе не дано летать, то хотя бы ползай с гордо поднятой головой.
PM MAIL ICQ Skype GTalk   Вверх
LSD
Дата 26.8.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(SID_M @  26.8.2009,  15:02 Найти цитируемый пост)
Кстати рассуждения по поводу того, что если разные ClassLoader-ы загрузили классы, и они друг к другу не приводятся себя не подтвердили. 
К счастью...

Да ну smile 
Проверь у объектов классы, что они действительно различны.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0582 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.