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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка классов в doGet 
:(
    Опции темы
jsa
Дата 2.2.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

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



Hi all!

есть сервлет:
Код

 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = null;

        try{
            out = resp.getWriter();
            out.println(req.getContextPath());

            ClassLoader classLoader = ClassLoader.getSystemClassLoader();
            Class aClass = classLoader.loadClass("<Pack1.Pack2>.Test"); // здесь возникает ClassNotFoundException
            Class[] classArg = new Class []{int.class};
            Constructor constructor = aClass.getConstructor(classArg);
            Object[] objects = new Object[]{(new Integer(5))};
            Object o = constructor.newInstance(objects);            
        }catch(Exception e){
            out.println(e.getMessage());
            e.printStackTrace();
        }finally{
            if (out != null)
                out.close();
        }
    }

и при выполнение GET сваливается, причем если выполнять код не из сервлета, то все работает, где у меня ошибка в 17 строке? smile

PS: класс <Pack1.Pack2>.Test лежит в WEB-INF/classes как надо


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
Stampede
Дата 2.2.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Цитата(jsa @ 2.2.2006, 12:59 Найти цитируемый пост)

и при выполнение GET сваливается, причем если выполнять код не из сервлета, то все работает, где у меня ошибка в 17 строке?


Дык, в 17-й строке.

Шютка smile На самом деле не в 17-й, а в строках 8-9. Ты пытаешься загрузить класс с использованием системного загрузчика, а он не знает про твой WEB-INF/classes, поэтому тут нужно задействовать текущий загрузчик (который загружал твое приложение, включая сервлет):

Код

Class aClass = Class.forName("pack1.pack2,Test");


И кстати, ты точно уверен, что хочешь использовать интроспекцию и создавать объекты через динамические аргументы? А то я мог бы предложить решение и попроще smile



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
jsa
Дата 3.2.2006, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

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



Stampede буду очен признателен если поделишься идеей, ксати, я тут выкрутился, може конечно изврат но все же:

Код

 public interface TestInterface {

    public int getNumber();

}

...
public class Test implements TestInterface {

    private int number;

    public Test(int number) {
        this.number = number;
    }

    public int getNumber() {
        return this.number;
    }

}
.....

            ///код сервлета (doGet)
            File file = new File(".....\\classes");
            out.println(file.toURL().toString());

            URL[] urls = new URL[]{file.toURL()};
            ClassLoader classLoader = new URLClassLoader(urls); // заработало
            Class aClass = classLoader.loadClass("....Test");
            Class[] classArg = new Class []{int.class};
            Constructor constructor = aClass.getConstructor(classArg);
            Object[] paramValues = new Object[]{(new Integer(55))};
            Object o = constructor.newInstance(paramValues);
            TestInterface testInterface = (TestInterface)o; // не работает, ClassCastException, почему? не догоняю, локально все ок
            out.println(testInterface.getNumber());





--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
Stampede
Дата 3.2.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Цитата(jsa @ 3.2.2006, 10:57 Найти цитируемый пост)

Stampede буду очен признателен если поделишься идеей,


С удовольствием, если ты намекнешь, какого эффекта хочешь добиться smile

Цитата(jsa @ 3.2.2006, 10:57 Найти цитируемый пост)

ксати, я тут выкрутился, може конечно изврат но все же:


Выкрутился в чем? В том, что вместо локального загрузчика каждый раз создаешь URLClassLoader? Чтобы доступиться к дефолтной директории классов? Зачем??? Это же делается в одну строку - так, как я предложил в предыдущем посте.

То, что у тебя кастинг не работает - эт я не знаю почему. По идее все должно быть пучком. Ты можешь из любопытства поинтересоваться, какаго же типа объект у тебя в действительности создается. Для этого после 34 строчки напиши:

Код

out.println("Class Name: " + o.getClass().getName());


А то так долго можно гадать smile

PM WWW   Вверх
jsa
Дата 6.2.2006, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

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



Цитата

С удовольствием, если ты намекнешь, какого эффекта хочешь добиться smile

хочю сделать динамическую загрузку классов, без явного объявления импорта, чтобы в дальнейшем не прописывать каждый класс и не править сервлет

Цитата

Выкрутился в чем? В том, что вместо локального загрузчика каждый раз создаешь URLClassLoader? Чтобы доступиться к дефолтной директории классов? Зачем??? Это же делается в одну строку - так, как я предложил в предыдущем посте.

просто я это сделал, еще до твоего поста с
Код

Class aClass = Class.forName(...);


Цитата

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

буду проверять


--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
jsa
Дата 6.2.2006, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

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



Stampede большой сенькс, все заработало как только сделал Class.forName
хотел + поставить, но не могу smile



--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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