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

5 Безопасных Загрузок Класса

Динамическая загрузка класса является важной функцией виртуальной машины Java, потому что это предоставляет платформе Java возможность установить компоненты программного обеспечения во время выполнения. У этого есть много уникальных характеристик. Прежде всего ленивая загрузка означает, что классы загружаются по требованию и в прошлый возможный момент. Во-вторых, динамическая загрузка класса поддерживает безопасность типов виртуальной машины Java, добавляя разовые ссылкой проверки, которые заменяют определенные проверки на этапе выполнения и выполняются только однажды. Кроме того программисты могут определить свои собственные загрузчики класса, которые, например, определяют удаленное расположение, от которого определенные классы загружаются, или присваивают соответствующие атрибуты безопасности им. Наконец, загрузчики класса могут использоваться, чтобы обеспечить отдельные пространства имен для различных компонентов программного обеспечения. Например, браузер может загрузить апплеты из различных веб-страниц, используя отдельные загрузчики класса, таким образом поддерживая степень изоляции между теми классами апплета. Фактически, эти апплеты могут содержать классы того же самого имени - эти классы обрабатываются как отличные типы виртуальной машиной Java.

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


5.1 Иерархии классов Загрузчика класса

Загружая класс, потому что могут быть многократные экземпляры объектов загрузчика класса в одной виртуальной машине Java, важный вопрос состоит в том, как делают мы определяем который загрузчик класса использовать. Java 2 SDK представили многократные классы загрузчика класса, представляется, у которых есть отличные свойства, таким образом, другой важный вопрос состоит в том, какой загрузчик класса мы должны использовать.

Корень иерархии классов загрузчика класса является абстрактным классом, названным java.lang. ClassLoder, первоначально определенный в JDK 1.0 и так как расширено. Класс java.security. SecureClassLoader, представленный в Java 2 SDK, v 1.2, является подклассом и конкретной реализацией абстрактного класса ClassLoder. Класс java.net. URLClassLoader является подклассом SecureClassLoader.

Утилита по имени Апплетвивер использует частный класс sun.applet. AppletClassLoader, чтобы загрузить апплеты. В JDK 1.0, AppletClassLoader является подклассом и конкретной реализацией ClassLoder. В Java 2 SDK это - подкласс URLClassLoader.

Создавая пользовательский класс загрузчика класса, можно разделить на подклассы от любого из вышеупомянутых классов загрузчика класса, в зависимости от определенных потребностей пользовательского загрузчика класса. Поскольку AppletClassLoader является частным классом, определенным в пакете солнца *, он не поддерживается и подвержен изменениям, таким образом, нельзя разделить на подклассы от него.


5.2 Исконный Загрузчик Класса

Поскольку каждый класс загружается его загрузчиком класса, и каждый загрузчик самого класса является классом и должен быть загружен другим загрузчиком класса, у нас, кажется, есть очевидная проблема цыпленка-и-яйца, то есть, куда загрузчик первого класса прибывает из? Есть "исконный'' загрузчик класса, который загружает процесс загрузки класса. Исконный загрузчик класса обычно пишется на родном языке, таком как C, и не проявляется в пределах контекста Java. Исконный загрузчик класса часто загружает классы из локальной файловой системы зависимым от платформы способом.

Некоторые классы, такие как определенные в пакете Java *, важны для корректного функционирования системы времени выполнения и виртуальной машины Java. Они часто упоминаются как базовые классы. Из-за исторических причин, у всех таких классов есть загрузчик класса, который является нулем. Этот нулевой загрузчик класса является, возможно, единственным знаком существования исконного загрузчика класса. Фактически, легче просто просмотреть нулевой загрузчик класса как исконный загрузчик класса.

Учитывая все классы в одной среде приложения Java, мы можем легко сформировать дерево загрузки класса, чтобы отразить отношение загрузки класса. Каждый класс, который не является загрузчиком класса, является вершиной. Родительский узел каждого класса является своим загрузчиком класса с нулевым загрузчиком класса, являющимся корневым классом. Такая структура является деревом, потому что не может быть циклов - загрузчик класса не мог загрузить свой собственный загрузчик класса предка.


5.3 Делегация Загрузчика класса

Когда один загрузчик класса просят загрузить класс, этот загрузчик класса или загружает класс непосредственно, или это может попросить, чтобы другой загрузчик класса сделал так. Другими словами загрузчик первого класса может делегировать к второму загрузчику класса. Отношение делегации является виртуальным в том смысле, что оно не имеет никакого отношения к который загрузки загрузчика класса который другой загрузчик класса. Вместо этого отношение делегации формируется, когда объекты загрузчика класса создаются, и в форме отношений отцов и детей. Однако, системный загрузчик класса является корневым предком делегации всех загрузчиков класса. Забота должна быть проявлена, чтобы гарантировать, что отношение делегации не содержит циклы. Иначе, процесс делегации может ввести в бесконечный цикл.

5.4 Алгоритм Разрешения класса

Реализация по умолчанию Java 2 метода ClassLoder SDK для того, чтобы загрузить класс ищет классы в следующем порядке: Здесь, первый шаг изучает локальный кэш загрузчика класса (или его функциональный эквивалент, такой как глобальный кэш), чтобы видеть, соответствует ли загруженный класс целевой класс. Последний шаг обеспечивает способ настроить механизм для того, чтобы искать классы; таким образом пользовательский загрузчик класса может переопределить этот метод, чтобы определить, как должен искаться класс. Например, загрузчик класса апплета может переопределить этот метод, чтобы вернуться к узлу апплета и попытаться определить местоположение файла класса и загрузить это по сети.

Если в каком-либо шаге класс располагается, это возвращается. Если класс не находится, используя вышеупомянутые шаги, исключение ClassNotFound выдается.

Заметьте, что является критическим для безопасности типов, что тот же самый класс не загружается не раз тем же самым загрузчиком класса. Если класс не среди уже загруженных, текущий загрузчик класса пытается делегировать задачу к загрузчику родительского класса. Это может произойти рекурсивно. Это гарантирует, что соответствующий загрузчик класса используется. Например, определяя местоположение системного класса, процесс делегации продолжается, пока системный загрузчик класса не достигается.

Мы видели алгоритм делегации ранее. Но, учитывая имя какого-либо класса, с какого загрузчика класса мы запускаем в попытке загрузить класс? Правила для того, чтобы определить загрузчик класса являются следующим:

Отметьте, что правила об использовании экземпляров URLClassLoader и AppletClassLoader имеют исключения и могут измениться в зависимости от определенной системной среды. Например, веб-браузер может хотеть снова использовать существующий AppletClassLoader, чтобы загрузить классы апплета из той же самой веб-страницы.

Из-за питания загрузчиков класса, мы строго ограничиваем, кто может создать экземпляры загрузчика класса. С другой стороны это является требуемым, чтобы обеспечить удобный механизм для приложений или апплетов, чтобы определить расположения URL и классы загрузки от них. Мы обеспечиваем статические методы, чтобы позволить любой программе создавать экземпляры класса URLClassLoader, хотя не другие типы загрузчиков класса.



СОДЕРЖАНИЕ | ПРЕДЫДУЩИЙ | NEXT
Авторское право © 1997-1999 Sun Microsystems, Inc. Все права защищены.

Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами