Насколько я вижу, с учетом 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)* вызов реального класса)?
Спасибо.