Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Загрузка классов в doGet


Автор: jsa 2.2.2006, 12:59
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 как надо

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

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


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

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

Код

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


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

Автор: jsa 3.2.2006, 10:57
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());



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

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


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

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

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


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

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

Код

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


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

Автор: jsa 6.2.2006, 05:56
Цитата

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

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

Цитата

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

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

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


Цитата

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)