Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Определение списка обьектов в xml файле


Автор: Akeem 12.1.2009, 18:22
Есть ли возможность хранить имена вызываемых классов в xml файле?

Суть проблемы:
Есть список классов которые должны последовательно выполнится. Хотелось бы этот список хранить в файле, так чтобы не пересобирать jar файл, а добавлять или удалять из файла.
 
Например:
Код

ClassList lsCL[] = {
new class1(),
new class2(),
new class3(),
....
};


Хотелось бы хранить имена class1, class2, class3 в xml файле ввиде:
Код

<ClassList>
<item attributes>class1</item> //attributes -- различные атрибуты елемента, например будет он входить в список или нет
<item attributes>class2</item>
<item attributes>class3</item>
</ClassList>



Автор: golubsv 12.1.2009, 19:05
http://exampledepot.com/egs/java.lang.reflect/pkg.html

а конкретно вроде так 

http://exampledepot.com/egs/java.lang.reflect/UseConstructor.html

Автор: Akeem 13.1.2009, 19:58
golubsv, 
Не совсем понимаю как это можно использовать.
Я думал над использованием класс Serializable но и его использование какое-то мутное.
 smile 

Автор: LSD 13.1.2009, 20:24
Берешь имя класса, получаешь объект типа Class, с помощью рефлексии создаешь инстанс и вызываешь нужный метод(ы), усё.
Код

    private boolean callMethod(String className, Class[] constructorParams, Object[] constructorValues, String methodName, Class[] methodParams, Object[] methodValues) {
        if(StringUtils.isEmpty(className) 
           || StringUtils.isEmpty(methodName)
           || !ArrayUtils.isSameLength(constructorParams, constructorValues)
           || !ArrayUtils.isSameLength(methodParams, methodValues))
          return false;

        try {
            Class clazz = Class.forName(className);
            Constructor constructor = clazz.getDeclaredConstructor(constructorParams);
            Object o = constructor.newInstance(constructorValues);
            Method method = clazz.getMethod(methodName, methodParams);
            method.invoke(o, methodValues);
        } catch(Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

Автор: Akeem 15.1.2009, 00:43
Проблема решилась с помощью Кода который привел LSD (немного модифицированого) и парсера xml .

Автор: LSD 15.1.2009, 12:50
Цитата(Akeem @  15.1.2009,  00:43 Найти цитируемый пост)
Проблема решилась

Тогда смелее пользуйся кнопкой "Пометить вопрос как решённый" smile 

Автор: Akeem 15.1.2009, 14:28
LSD, 
Хм. Я сразу пометил что вопрос решенный. 

Автор: sergioK 18.1.2009, 23:58
Цитата(LSD @ 13.1.2009,  20:24)
Берешь имя класса, получаешь объект типа Class, с помощью рефлексии создаешь инстанс и вызываешь нужный метод(ы), усё.
Код

    private boolean callMethod(String className, Class[] constructorParams, Object[] constructorValues, String methodName, Class[] methodParams, Object[] methodValues) {
        if(StringUtils.isEmpty(className) 
           || StringUtils.isEmpty(methodName)
           || !ArrayUtils.isSameLength(constructorParams, constructorValues)
           || !ArrayUtils.isSameLength(methodParams, methodValues))
          return false;

        try {
            Class clazz = Class.forName(className);
            Constructor constructor = clazz.getDeclaredConstructor(constructorParams);
            Object o = constructor.newInstance(constructorValues);
            Method method = clazz.getMethod(methodName, methodParams);
            method.invoke(o, methodValues);
        } catch(Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

LSD ,

все понятно только можно пример как эти параметры создаються ?
как создавать constructorParams , constructorValues, 
methodParams и methodValues 

где то это уже было только не могу найти где 

Автор: Akeem 19.1.2009, 14:53
sergioK, 
Вот пример как создаются:
Код

Class [] constructorParams = 
                {
                    Connection.class,
                    Logger.class,
                };

Connection oConn = new Connection();
Logger log = new Logger();

Object [] constructorValues =
                {
                    oConn,
                    log,
                };
        


Аналогично создаются и для methodParams и methodValues 

Автор: Akeem 19.1.2009, 17:50
LSD, 
Один неприятный момент возник при использовании такого подхода. Если создаются несколько обьектов с одинаковым конструктором то возможен ексепшн:

Код

Exception in thread "main" java.lang.NoClassDefFoundError: Connection
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
    at java.lang.Class.getConstructor0(Unknown Source)
    at java.lang.Class.getDeclaredConstructor(Unknown Source)
    at Commons.ObjectFactory.callObject(ObjectFactory.java:56)
    at MainRun.main(MainRun.java:45)
Caused by: java.lang.ClassNotFoundException: Connection
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    ... 6 more

Автор: LSD 20.1.2009, 12:37
Дай рабочий пример демонстрирующий ошибку.

Автор: Akeem 20.1.2009, 13:32
Извините, это мой недосмотр.
Тот ексепш возникает когда:
  •  В класе нет конструктора явно обявленого
  •  Конструктор не содержит указываемых параметров.
  •  В Класе ошибка компиляции связаная с импортом параметров конструктора.

Скорее всего подобный ексепш можно получить и для метода класа.

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