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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование заранее не определенного класса 
V
    Опции темы
Asal
Дата 7.1.2007, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



простите если мой вопрос покажется глупым, но Java я изучаю не долго и маловато навыков.

1. работает приложение используя org.apache.ojb
2. есть классик для работы с БД, который использует класс PersistenceBroker
У этого класса есть метод broker.store(Object ...) который вставляет наш объект в базу.
название базы, имя таблицы и имена полей он берет из XML. Для каждого класса соответствена своя таблица в БД и свое объявление в .java

Проблема заключается в следующем:
для работы функции broker.store(Object ...) необходимо не только наличие Object, но и принадлежнасть его к определенному классу, по этому классу функция определяеи куда вставлять данные (в какую таблицу)

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

Вопрос:
Как это сделать?  smile 

Собственно функция:
Код

public void insert(Object insertRecord) throws DataAccessException {
      
      User memberVO = null;
      PersistenceBroker broker = null;
       try{
            broker = ServiceLocator.getInstance().findBroker();
             memberVO = (User) insertRecord;
                       
            broker.beginTransaction();
              broker.store(memberVO);
            broker.commitTransaction();
        }
        catch(ServiceLocatorException e){
         log.error("ServiceLocatorException thrown in SmgDAO.insert()", e);
            throw new DataAccessException("ServiceLocator in Error in SmgDAO.insert()",e);
        }
        catch (PersistenceBrokerException e){
            // if something went wrong: rollback
            broker.abortTransaction();
              
         log.error("PersistenceBrokerException thrown in SmgDAO.insert()", e);
            throw new DataAccessException("Error in SmgDAO.insert()",e);
        }
        finally{
          if (broker!=null) broker.close();
        }
    }



--------------------
PM MAIL ICQ   Вверх
powerOn
Дата 7.1.2007, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Если у тебя камнем преткновения является определение принадлежности объекта к какому-либо классу, то это можно определить используя выражение instanceof. В документации посмотришь что да как.  smile 
Ещё имя класса для объекта можно получить следующим образом:
Код

Object o = .... // где-то была инициализация.
String className = o.getClass().getName(); // получение имени объекта.



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Asal
Дата 7.1.2007, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да в этом то и проблема что необходимо не просто получить название класса!
необходимо определить переменную memberVO как переменную определенного класса
что-то типо этого (но так нельзя ((( . такое объявление - глупость)

Код

insertRecord.getClass() memberVO = null;
memberVO = (insertRecord.getClass()) insertRecord;


этим я хочу сказать что необходимо создать переменную того класса который к нам приходит, а как это сделать понятие не имею
Наверное тут надо использовать что-то типо позднего связывания.
Вот только не знаю как это реализовать это на Java


--------------------
PM MAIL ICQ   Вверх
powerOn
Дата 7.1.2007, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Ясно. тебе нужно смотреть в сторону Reflection.
Он позволяет создавать объекты зная только его имя. А так же ещё очень многое. 

Например создание класса по имени:
Код

try {
            Class clazz = Class.forName("java.util.Vector");
            Vector v = (Vector) clazz.newInstance();
            System.out.println(v.getClass().getName());
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        }



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Asal
Дата 7.1.2007, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да штучка класная !
Но ...
Это все равно что сделать
Код

public void insert(Object insertRecord) throws DataAccessException {
  User memberVO = new User();
                      ...

а хчется все же
Код

public void insert(Object insertRecord) throws DataAccessException {
  User memberVO = (User) insertRecord;
                     ...


вот тут и возникает проблема с приведением типов, надо-то явно указать
Может можно как-то конвертировать мой Object insertRecord в класс имя которого мы получим из insertRecord 


--------------------
PM MAIL ICQ   Вверх
LSD
Дата 7.1.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Asal @  7.1.2007,  03:01 Найти цитируемый пост)
а хчется все же

Еще раз.
Если ты заранее знаешь какого типа может быть объект, то используй instanceof или getClass().

Если же ты вообще не имеешь представления о том, что это за объект, то и конструкция типа:
Код
public void insert(Object insertRecord) throws DataAccessException {
  User memberVO = (User) insertRecord;
...

тебе не поможет, т.к. об этом объекте на этапе компиляции ничего не известно. А поможет только Reflection.


--------------------
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   Вверх
Foo
Дата 7.1.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Asal @ 7.1.2007,  03:01)

а хчется все же
Код

public void insert(Object insertRecord) throws DataAccessException {
  User memberVO = (User) insertRecord;
                     ...

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

Код


public void insert(Object insertRecord) throws DataAccessException {

if (insertRecord instanceof User){
         User memberVO = (User) insertRecord;
}


--------------------
qip
PM MAIL   Вверх
Asal
Дата 7.1.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Thanks всем за помощь!!!
Особенно powerOn !

Впринципе проблемы как оказалось и нет ))) Функция broker.store(Object ...) кушает хорошо и просто Object.
Но на будущее опыт хороший...

Цитата(LSD @  7.1.2007,  14:45 Найти цитируемый пост)
Если же ты вообще не имеешь представления о том, что это за объект, то и конструкция типа:
Код

public void insert(Object insertRecord) throws DataAccessException {  
  User memberVO = (User) insertRecord;
}
тебе не поможет, т.к. об этом объекте на этапе компиляции ничего не известно. А поможет только Reflection.


кострукция была приведена для более наглядного примера )
Тут действительно единственное что может помочь это Reflection


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

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

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


 




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


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

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