Есть ли способ получить объект, на который ссылается RMI Proxy, если известно, что объект этот находится в той же виртуальной машине?
Сценарий таков:
Имеем интерфейс-фабрику, который создаёт и выдает клиентам некоторые объекты через RMI.
Все объекты, которые создает фабрика — Remote, то есть, передаются по ссылке, а не по значению.
Этот же интерфейс содержит методы, в которые клиент может передать эти только-что созданные объекты, для некоторой обработки. Пример:
class MyFactoryImpl implements IMyFactory {
public IMyObject createObject() {
return new MyObjectImpl();
}
public void processObject(IMyObject object) {
// do something with object
// MyObjectImpl impl = (MyObjectImpl) object; // <------
}
}
В отмеченной строке объект, переданный от клиента, должен подвергнуться некой обработке, причем должен использоваться тот факт, что на самом деле это ссылка на MyObjectImpl. То есть, фабрика "знает" о внутренностях объектов, которые она же и плодит. Однако при вызове метода processObject через RMI приходит прокси, реализующий IMyObject и все вызовы методов на нем отправляются через RMI/TCP в ту же виртуальную машину, где и находится моя фабрика.
А теперь вопрос:
как с наименьшими затратами (без дополнения IMyObject новыми методами для получения какого-нибудь "UID" объекта) получить из IMyObject реальный MyObjectImpl, на который "указывает" прокси. Считаем, что "чужие" объекты, созданные в других фабриках, сюда передаваться не будут, поэтому известно, что получить MyObjectImpl можно всегда.
Поиском пользовался — возможно, есть способ сделать подобное через смарт-прокси, но нет ли способа проще?
Спасибо заранее!
Re: RMI: Как получить реальный объект, имея Proxy?
vlp>class MyFactoryImpl implements IMyFactory {
vlp> public void processObject(IMyObject object) {
vlp> // do something with object
vlp> // MyObjectImpl impl = (MyObjectImpl) object; // <------
vlp> }
vlp>}
vlp>
Любопытно, что фабрика, которая вроде как реализация GoF Abstract Factory, занимается ещё и какой-то обработкой информации.
vlp>А теперь вопрос: vlp>как с наименьшими затратами (без дополнения IMyObject новыми методами для получения какого-нибудь "UID" объекта) получить из IMyObject реальный MyObjectImpl, на который "указывает" прокси. Считаем, что "чужие" объекты, созданные в других фабриках, сюда передаваться не будут, поэтому известно, что получить MyObjectImpl можно всегда.
Странное желание искать решение через одно место. Почему бы не поступить так как это сделали в EJB. Локальные вызовы должны быть локальными, а не через RMI.
Re[2]: RMI: Как получить реальный объект, имея Proxy?
Здравствуйте, Blazkowicz, Вы писали:
B>Странное желание искать решение через одно место. Почему бы не поступить так как это сделали в EJB. Локальные вызовы должны быть локальными, а не через RMI.
Sorry, не допонял вопрос, что объекты едут на клиента а оттуда "возвращаются" на сервер.
Re[3]: RMI: Как получить реальный объект, имея Proxy?
Здравствуйте, Blazkowicz, Вы писали:
B>>Странное желание искать решение через одно место. Почему бы не поступить так как это сделали в EJB. Локальные вызовы должны быть локальными, а не через RMI. B>Sorry, не допонял вопрос, что объекты едут на клиента а оттуда "возвращаются" на сервер.
"фабрика" создает объекты и возвращает клиенту. Клиент может вызывать методы этих объектов через некий стандартный интерфейс IMyObject, после чего передать этот объект обратно на серверную сторону, где его и надо "превратить" обратно в MyObjectImpl
Re[2]: RMI: Как получить реальный объект, имея Proxy?
Здравствуйте, vlp, Вы писали:
vlp>Здравствуйте, Blazkowicz, Вы писали:
B>>>Странное желание искать решение через одно место. Почему бы не поступить так как это сделали в EJB. Локальные вызовы должны быть локальными, а не через RMI. B>>Sorry, не допонял вопрос, что объекты едут на клиента а оттуда "возвращаются" на сервер.
vlp>"фабрика" создает объекты и возвращает клиенту. Клиент может вызывать методы этих объектов через некий стандартный интерфейс IMyObject, после чего передать этот объект обратно на серверную сторону, где его и надо "превратить" обратно в MyObjectImpl
IMyObject по какой-то причине Remote. Почему бы не использовать объекты by value для передачи данных?
Re[3]: RMI: Как получить реальный объект, имея Proxy?
Здравствуйте, Blazkowicz, Вы писали:
B>>Странное желание искать решение через одно место. Почему бы не поступить так как это сделали в EJB. Локальные вызовы должны быть локальными, а не через RMI. B>Sorry, не допонял вопрос, что объекты едут на клиента а оттуда "возвращаются" на сервер.
А вот еще пример, допустим, что item, list, factory — все объекты создаются удаленно и передаются по ссылке через RMI:
В реализации интерфейса IList на сервере происходит то же самое — хочется получить из пришедшей через RMI заглушки IItem сам объект, какой-нибудь ItemImpl...
Какие тут есть способы?
Re[5]: RMI: Как получить реальный объект, имея Proxy?
Здравствуйте, Blazkowicz, Вы писали:
vlp>>"фабрика" создает объекты и возвращает клиенту. Клиент может вызывать методы этих объектов через некий стандартный интерфейс IMyObject, после чего передать этот объект обратно на серверную сторону, где его и надо "превратить" обратно в MyObjectImpl
B>IMyObject по какой-то причине Remote. Почему бы не использовать объекты by value для передачи данных?
Понятно, что передача по значению все решила бы. Но, во-первых, раз уж я натолкнулся на этот момент, хотелось бы уже все выяснить. Во-вторых, скорее всего IMyObject это будет не просто объект с данными, вызовы методов этого интерфейса должны обрабатываться на сервере.
Re: RMI: Как получить реальный объект, имея Proxy?
Можно поставить вопрос по-другому: как, имея RemoteRef на объект, средствами RMI-runtime (не заводя вручную собственных HashMap с ИД и объектами) получить сам объект, если он находится в той же виртуальной машине?