В чем именно заключается смысл кодовой базы в Java RMI?
В настоящее время я изучаю RMI.
Я действительно не понимаю концепцию кодовой базы. Каждая статья, которую я читаю, предполагает, что клиент, который вызывает удаленный объект, может загрузить определения метода из кодовой базы. Проблема теперь в следующем:мне все равно не нужны описания/интерфейсы в моем пути к классу? Как я могу вызывать методы на удаленном объекте, если я знаю их только во время выполнения? Это даже не компилируется.
Я что, совсем упустил суть? Что же именно такое значит, точка кодовой базы? Похоже, что для обеспечения кодовой базы требуется много дополнительной работы и требований
Спасибо
1 ответ:
Ну, допустим, вы предоставляете клиенту только интерфейсы, а реализации будут располагаться в заданной кодовой базе. Затем клиент запрашивает сервер для отправки данного объекта, клиент ожидает получить объект, который реализует данный интерфейс, но фактическая реализация неизвестна клиенту, когда он десериализует отправленный объект, когда он должен перейти к кодовой базе и загрузить соответствующий класс реализации для фактического объекта, являющегося пройденный.
Это сделает клиент очень тонким, и вы очень легко обновите свои классы в базе кода, не прибегая к обновлению каждого отдельного клиента.EDIT
Допустим, у вас есть сервер RMI со следующим интерфейсом
public interface MiddleEarth { public List<Creature> getAllCreatures(); }
Клиент будет иметь только интерфейсы для
MiddleEarth
иCreature
, но ни одна из реализаций в пути к классу., где реализации
Когда вы попросите ваш сервер RMI отправить вам список всех существ в Средиземье, он отправит объекты, которые реализуютCreature
являются сериализуемыми объектами типаElf
,Man
,Dwarf
иHobbit
. И эти реализации находятся в вашей кодовой базе, но не в пути к классу вашего клиента.Creature
, то есть любой из классов, перечисленных выше.Когда клиент получает сериализованные объекты, он должен искать файлы классов, чтобы десериализовать их, но они не расположены в локальном пути к классу. Каждый объект в этом потоке идет маркировка с заданной базой кода, которую можно использовать для поиска недостающих классов. Поэтому клиент обращается к базе кода для поиска этих классов. Там он найдет фактические классы существ, которые используются.
Кодовая база работает в обоих направлениях, поэтому это означает, что если вы отправите вашему серверу a
Creature
(то есть anEnt
), он также будет искать его в базе кода.Это означает, что когда и клиент, и сервер должны публиковать новые типы существ все они должны сделать это, чтобы обновить
creaturesImpl.jar
в базе кода, и ничего в самих серверных или клиентских приложениях.