Реализация динамической заглушки прокси-сервера RMI
-
22-08-2019 - |
Вопрос
Я хочу понять, как реализация динамической заглушки прокси-сервера на самом деле выполняется за сценой.Согласно тому, что я прочитал, к моменту экспорта удаленного объекта, если предварительно сгенерированный класс-заглушка не найден, среда выполнения RMI сгенерирует динамический прокси для выполнения функций заглушки.Затем эта заглушка привязывается к реестру RMI и позже становится доступной какому-либо клиенту RMI.
Вопрос в том,:поскольку заглушка на самом деле является динамически генерируемым прокси-сервером, определение ее класса не было бы доступно на стороне клиента, тогда как получается, что клиент все еще может извлекать заглушку из реестра RMI?Происходит ли какая-то динамическая загрузка классов за сценой или RMI использует другой метод для обхода этого?
Решение
Java.lang.reflect.Proxy сериализуем и имеет специальную поддержку в ObjectOutputStream и ObjectInputStream.По сути, сериализуются только реализованные интерфейсы и обработчик вызова, а во время десериализации из них создается новый динамический прокси-сервер.
Другие советы
RMI действительно использует динамическую загрузку классов - путь к классу отправляется вместе с вызовом в виде "аннотации пути к классу", из которой клиент загружает класс.Вы можете посмотреть на реализацию RMI для получения дополнительной информации - она доступна как часть исходного кода JDK.В частности, классы ObjectOutputStream и RMIClassLoader.
Обновить:RMI не запускает HTTP-сервер - на самом деле, для этого вам понадобится ваше собственное решение.Одним из них, как вы упомянули, может быть HTTP-сервер, который вы запускаете, делаете классы доступными через сервер и передаете кодовую базу с адресом / портом HTTP-сервера в ваших заглушках, чтобы ваши клиенты могли их загружать.