RMI и ссылки / Прокси классы - PullRequest
       4

RMI и ссылки / Прокси классы

1 голос
/ 31 декабря 2011

Насколько я вижу, с учетом IFoo интерфейса, расширяющего Remote и FooImpl класса, реализующего IFoo, следующие два фрагмента кода (почти) эквивалентны: (1)

IFoo stub = ( IFoo )UnicastRemoteObject.exportObject( new FooImpl() );
Naming.bind( "foo", stub );

и, если FooImpl является классом, расширяющим UnicastRemoteObject: (2)

Naming.bind( "foo", new FooImpl() );

Фактически, экспорт экземпляра FooImpl выполняется в неявном вызове конструктора UnicastRemoteObject.

Но в (1) объект, возвращаемый UnicastRemoteObject.exportObject(), является Proxy (динамическим) классом, и, следовательно, объект, записанный в реестре RMI, является, очевидно, ссылкой.В то время как в (2) это не ясно.

Где реализована конструкция Proxy, основанная на экземпляре FooImpl?Я видел, что управление реестром RMI в клиентском коде (Naming.bind()) инкапсулирует создание (реестра) Proxy класса с вызовом LocateRegistry.getRegister().Итак, в запросе:

Naming.bind( "foo", new FooImpl() )

это обработчик вызова класса реестра Proxy, который обрабатывает параметры, расширяющие Remote, чтобы преобразовать их как ссылки / Proxy классы?

Ив этом случае, учитывая, что класс заглушки Proxy в (1) сам по себе является классом Remote, это будет означать, что объект, хранящийся в реестре, является ссылкой на ссылку (то есть Proxy, вызывающий другой * 1037)* вызов реального класса)?

Спасибо.

1 Ответ

3 голосов
/ 01 января 2012

Когда объект FooImpl направляется в Реестр в вызове bind (), он автоматически заменяется своей заглушкой.Это происходит для любого экспортируемого удаленного объекта, когда он используется в качестве параметра или результата удаленного метода.

...