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


Автор: Asal 7.1.2007, 02:00
простите если мой вопрос покажется глупым, но 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();
        }
    }

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

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

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

Код

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


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

Автор: powerOn 7.1.2007, 02:38
Ясно. тебе нужно смотреть в сторону http://java.sun.com/docs/books/tutorial/reflect/index.html.
Он позволяет создавать объекты зная только его имя. А так же ещё очень многое. 

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

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();
        }

Автор: Asal 7.1.2007, 03:01
Да штучка класная !
Но ...
Это все равно что сделать
Код

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 

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

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

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

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

Автор: Foo 7.1.2007, 14:55
Цитата(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;
}


Автор: Asal 7.1.2007, 23:29
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

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