Spec-Zone .ru
спецификации, руководства, описания, API
СОДЕРЖАНИЕ | ПРЕДЫДУЩИЙ | NEXT Java Удаленный Вызов метода


3.4 Динамическая Загрузка Класса

RMI позволяет параметрам, возвращаемым значениям и исключениям, которые передают в вызовах RMI быть любым объектом, который сериализуем. RMI использует объектный механизм сериализации, чтобы передать данные от одной виртуальной машины до другого и также аннотирует поток вызова соответствующей информацией о расположении так, чтобы файлы определения class могли быть загружены в получателе.

Когда параметры и возвращаемые значения для удаленного вызова метода неупорядочиваются, чтобы стать живыми объектами в JVM получения, определения class требуются для всех типов объектов в потоке. Процесс немаршалинга сначала пытается разрешить классы по имени в его локальном контексте загрузки class (контекст загрузчик class текущего потока). RMI также предоставляет средство для того, чтобы оно динамически загрузило определения class для фактических типов объектов, которые передают как параметры и возвращаемые значения для удаленных вызовов метода от сетевых расположений, определенных конечной точкой передачи. Это включает динамическую загрузку удаленных тупиковых классов, соответствующих определенным классам реализации удаленного объекта (и используемый, чтобы содержать удаленные ссылки) так же как любой другой тип, который передает значение в вызовах RMI, таких как подкласс объявленного типа параметра, который не уже доступен в контексте загрузки class стороны немаршалинга.

Чтобы поддерживать динамическую загрузку class, время выполнения RMI использует специальные подклассы java.io.ObjectOutputStream и java.io.ObjectInputStream для упорядочивать потоков, которые это использует для маршалинга и немаршалинга параметров RMI и возвращаемых значений. Эти подклассы соответственно переопределяют annotateClass метод ObjectOutputStream и resolveClass метод ObjectInputStream передавать информацию о том, где определить местоположение файлов class, содержащих определения для классов, соответствующих дескрипторам class в потоке.

Поскольку каждый дескриптор class, записанный RMI, упорядочивают поток, annotateClass метод добавляет к потоку результат вызова java.rmi.server.RMIClassLoader.getClassAnnotation для объекта class, который может быть null или может быть a String объект, представляющий кодовую базу путь URL (разделенный пробелом список URL), с которого удаленная конечная точка должна загрузить файл определения class для данного class.

Поскольку каждый дескриптор class, считанный из RMI, упорядочивают поток, resolveClass метод читает единственный объект из потока. Если объектом является Строка (и значение java.rmi.server.useCodebaseOnly свойство не true), тогда resolveClass возвращает результат вызова RMIClassLoader.loadClass с аннотируемым String возразите как первый параметр и имя требуемого class в дескрипторе class как второй параметр. Иначе, resolveClass возвращает результат вызова RMIClassLoader.loadClass с именем требуемого class как единственный параметр.

См. раздел "Класс RMIClassLoader" для большего количества деталей о class, загружающемся в RMI.



СОДЕРЖАНИЕ | ПРЕДЫДУЩИЙ | NEXT
Copyright 1997, 2010, Oracle и/или его филиалы. Все права защищены.