Главная » Java » Спецификации пакетов и объекты Package

0

 

  Пакеты обычно реализуются в соответствии с определенной спецификацией и разрабатываются, как правило, в одной организации. Объект класса Package, в отличие от других рефлективных типов, не предназначен для динамического создания объектов (в данном случае — пакетов) и манипуляций ими и служит в качестве хранилища данных о спецификации пакета (заголовка, наименования компании-поставщика и номера версии), а также об аналогичных деталях реализации пакета как такового. Хотя пакеты обычно разрабатываются в рамках одной компании, спецификации пакетов (например, спецификация библиотеки функций статистического анализа) подчас являются плодом совместных усилий нескольких организаций-разработчиков. Программам, использующим пакет, может потребоваться информация о номере его версии, которая поможет выбрать нужную логическую цепочку вычислений или обойти возможные ошибки, присущие той или иной версии пакета. Ниже перечислены основные методы класса Package, позволяющие извлечь нужную информацию о пакете.

 

 public String getNameO

Возвращает   наименование   пакета,   соответствующего   текущему   объекту Package.

 

 public string getSpecificationTitleO

Возвращает заголовок спецификации, реализованной в пакете, либо null, если заголовок не известен

 

 Public string getSpecificationversionO

Возвращает строку с номером версии спецификации, реализованной в пакете, либо null, если номер не известен.

 

 public string getSpecificationvendorO

Возвращает строку с наименованием компании-поставщика спецификации, реализованной в пакете, либо null, если наименование не известно.

 

 Public string getlmplementationTitleO

Возвращает заголовок реализации пакета либо null, если заголовок не известен.

 

Public string getlmplementationversionO

Возвращает строку с номером версии реализации пакета либо null, если номер не известен.

 

public string getlmplementationvendorO

Возвращает   строку  с   наименованием   компании-поставщика  реализации пакета либо null, если наименование не известно.

 

Например,  сведения о пакете java.lang,  установленном в нашей системе

выглядят так:

Specification Title:                     Dava Platform API Specification

Specification Version:   1.3

Specification vendor:                Sun Microsystems,   inc.

implementation Title:   Java Runtime Environment

implementation Version:            1.3

implementation vendor:             Sun Microsystems,   inc.

   Номера версий спецификаций задаются неотрицательными числами с использованием десятичной точки — такими как "2.0" или "11.0.12". Подобная схема нумерации согласуется с реализацией метода isCompatiblewfth, позволяющего сравнивать номер версии спецификации пакета с номером, переданным в качестве аргумента. Метод возвращает значение true, если номер версии спецификации пакета не меньше, нежели переданный. Сравнение выполняется последовательно для каждой пары компонентов-чисел, разделенных символом точки, и завершается при их несовпадении. Если некоторое из таких чисел в номере версии спецификации меньше, нежели соответствующее число в параметре, версии считаются несовместимыми, и метод возвращает false. Если один из номеров содержит больше компонентов, чем другой, отсутствующие компоненты в более коротком номере принимаются равными нулю. Если, например, номер спецификации пакета, равный "1.2", сопоставляется с номерами-параметрами "1.2", "1.2.0" или "1.1.8", метод возвратит true. Если же в качестве параметра передать "1.2.2" или "1.3", результатом сравнения будет false. Рассмотренный механизм сопоставления реализует принцип обратной совместимости (backward compatibility) версий спецификаций.

   Для представления номеров версий реализаций пакетов универсальный формат не предусмотрен, поскольку созданием пакетов занимаются самые разные компании и организации. Единственным способом сопоставления номеров версий реализаций служит непосредственная проверка равенства — принцип обратной совместимости в данном случае не поддерживается.

   Пакеты могут быть запечатаны (sealed) — это значит, что они не допускают расширения посредством включения объявлений новых типов. Незапечатанный пакет может содержать классы, которые расположены в различных местах в пределах пути поиска классов. Содержимое запечатанного пакета должно иметь единый источник происхождения — обычно это определенный архивный файл либо местоположение, заданное некоторым адресом URL. Существуют два метода, позволяющих выяснить, запечатан ли пакет, — эти методы описаны ниже.

public boolean isSealedO

Возвращает true, если пакет запечатан.

public boolean isSealed(URL url)

Возвращает true, если пакет, местоположение которого определяется з данным адресом url, запечатан и доступен по этому адресу. Возвращав false, если пакет не может быть загружен с указанного адреса либо не запечатан.

  

Сведения об особенностях спецификации пакета и его реализации обычно сЛужат частью манифеста (manifest), сохраняемого в составе пакета, — аналогично манифесту файла формата Java ARchive (JAR) (обратитесь к разделу 20.9.1 на странице 562). Эта информация считывается системой при загрузке класса из пакета. Объект ClassLoader, выполняющий загрузку класса, может динамически определить соответствующий объект Package, используя метод, рассмотренный ниже.

protected Package definePackage(string name, string specTitle, String specversion, String specvendor, string implTitle, String implversion,   String implvendor,   URL sealBase)

Возвращает объект класса Package с заданным именем и указанными значениями параметров спецификации и реализации. Если значение sealBase равно null, пакет считается незапечатанным — иначе он запечатан по отношению к заданному адресу URL. Объект Package для класса должен быть определен до того, как определен сам класс, и имя пакета обязано быть уникальным для конкретного объекта загрузчика классов. Если имя пакета совпадает с существующим, выбрасывается исключение типа illegalArgumentException.

  Объект Package для заданного класса может быть получен с помощью метода getPackage объекта типа Class, отвечающего классу. Того же результата нетрудно добиться посредством вызова статических методов Package.getPackage (с заданием имени пакета) и Package.getPackages — последний возвращает массив объектов Package, соответствующих всем известным системе пакетам. Оба метода действуют в контексте загрузчика классов, обращаясь к его одноименным методам, getPackage или getPackages. Указанные методы осуществляют поиск определенного загрузчика классов и всех его "родителей". Если текущего загрузчика классов не существует, используется системный загрузчик классов.

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии