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


Автор: olyx 18.12.2007, 17:19
Доброго времени суток уважаемые Java-гуру!
Пишу приложение - екстеншн для опенофиса. Имеется функция, которая выполняет sql запрос в контексте опенофиса, и которая должна возвращать RowSet.
Код

public javax.sql.RowSet ExecSQL(String DataSource, String SQLtext)
        throws com.sun.star.uno.Exception, java.lang.Exception{
        xMCF = xContext.getServiceManager();
        Object rowSet = xMCF.createInstanceWithContext("com.sun.star.sdb.RowSet", xContext);
        com.sun.star.sdbc.XRowSet xRowSet = (com.sun.star.sdbc.XRowSet) 
            UnoRuntime.queryInterface(com.sun.star.sdbc.XRowSet.class, rowSet);
        XPropertySet xProp = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class, xRowSet);
        xProp.setPropertyValue("DataSourceName", DataSource);
        xProp.setPropertyValue("CommandType", new Integer(com.sun.star.sdb.CommandType.COMMAND));
        xProp.setPropertyValue("Command",SQLtext);
        xProp.setPropertyValue("User", "loginname");
        xProp.setPropertyValue("Password", "pass");
        xRowSet.execute();
        return (javax.sql.RowSet)rowSet;
}
 
Данный код компилится , но при выполнении выбрасывает исключение java.lang.ClassCastException: $Proxy0 в строке
Код

 return (javax.sql.RowSet)rowSet;

Понятно, что несовместимые классы. Посмотрел в дебагере - объект rowSet имеет тип $Proxy0. И как его привести к javax.sql.RowSet (по сути это же одно и тоже) - совершенно непонятно. 
Можеть хто из вас сталкивался с этой проблемой, подскажите плиз!


Автор: AlexeyVorotnikov 18.12.2007, 17:50
А что за классы такие
com.sun.star.sdb.RowSet
com.sun.star.sdbc.XRowSet и т.д.?

Автор: hamsterKSU 19.12.2007, 10:22
Proxy приводится только к интерфейсам, но не к класам. 

Автор: LSD 19.12.2007, 14:04
Цитата(hamsterKSU @  19.12.2007,  10:22 Найти цитируемый пост)
Proxy приводится только к интерфейсам, но не к класам. 

Дык javax.sql.RowSet и есть интерфейс.

Проверь что за объект тебе возвращает xMCF.createInstanceWithContext():
Код

Class clazz = rowSet.getClass();
System.out.println("Is proxy class = " + Proxy.isProxyClass(clazz));
System.out.println("Interfaces = " + Arrays.asList(clazz.getInterfaces()));

Автор: olyx 19.12.2007, 17:04
rowSet содержит следующие интерфейсы:
  • com.sun.star.lib.uno.Proxy
  • com.sun.star.uno.IQueryInterface
  • com.sun.star.uno.XInterface
Мда... это не RowSet хотя он из RowSet-а создан (xMCF.createInstanceWithContext("com.sun.star.sdb.RowSet", xContext))
Что то я уже вообще не понимаю что к чему. 
 smile 

Автор: LSD 19.12.2007, 17:27
Теперь смотри что можно из этих интерфейсов вытащить.

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