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


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

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

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

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

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

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

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



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