Введение

Компьютерная программная платформа Java Platform, Standard Edition (Java SE) — это вычислительная платформа для разработки и развертывания переносимого кода для настольных и серверных сред. Java SE ранее называлась Java 2 Platform, Standard Edition (J2SE). Платформа использует язык программирования Java и входит в семейство программных платформ Java. Java SE определяет набор универсальных API, таких как Java API для Java Class Library, а также включает спецификацию языка Java и спецификацию виртуальной машины Java. OpenJDK является официальной референсной реализацией, начиная с версии 7.

Номенклатура, стандарты и спецификации

Платформа была известна как Java 2 Platform, Standard Edition или J2SE, начиная с версии 1.2, пока в версии 1.5 название не было изменено на Java Platform, Standard Edition или Java SE. "SE" используется для различения базовой платформы от платформ Enterprise Edition (Java EE) и Micro Edition (Java ME). Изначально "2" должно было подчеркнуть значительные изменения, представленные в версии 1.2, но было удалено в версии 1.6. Система наименований несколько раз менялась на протяжении истории версий Java. Начиная с J2SE 1.4 (Merlin), Java SE разрабатывалась в рамках Java Community Process, который создает описания предлагаемых и окончательных спецификаций для платформы Java, называемых Java Specification Requests (JSR). JSR 59 был базовой спецификацией для J2SE 1.4, а JSR 176 – для J2SE 5.0 (Tiger). Java SE 6 (Mustang) была выпущена под JSR 270. Java Platform, Enterprise Edition (Java EE) – это связанная спецификация, включающая все классы Java SE, а также дополнительные классы, более полезные для программ, работающих на серверах, а не на рабочих станциях. Java Platform, Micro Edition (Java ME) – это связанная спецификация, предназначенная для предоставления сертифицированного набора Java API для разработки программного обеспечения для небольших устройств с ограниченными ресурсами, таких как мобильные телефоны, КПК и приставки. Java Runtime Environment (JRE) и Java Development Kit (JDK) – это фактические файлы, которые загружаются и устанавливаются на компьютер для запуска или разработки программ на Java соответственно.

java.lang (включает в себя

Пакет Java содержит фундаментальные классы и интерфейсы, тесно связанные с языком и средой выполнения. Он включает в себя корневые классы, формирующие иерархию классов, типы, связанные с определением языка, базовые исключения, математические функции, многопоточность, функции безопасности, а также некоторую информацию об основной нативной системе. Этот пакет содержит 22 из 32 классов ошибок, предоставляемых в JDK 6. Основные классы и интерфейсы в `java.lang`:

– класс, являющийся корнем каждой иерархии классов.
– базовый класс для классов перечислений (начиная с J2SE 5.0).
– класс, являющийся корнем системы отражения Java.
– класс, являющийся базовым классом иерархии классов исключений.
– , , и – базовые классы для каждого типа исключений.
– класс, позволяющий выполнять операции с потоками.
– класс для строк и строковых литералов.
– и – классы для выполнения манипуляций со строками (StringBuilder начиная с J2SE 5.0).
– интерфейс, позволяющий осуществлять обобщенное сравнение и упорядочение объектов (начиная с J2SE 1.2).
– интерфейс, позволяющий осуществлять итерацию с использованием расширенного цикла `for` (начиная с J2SE 5.0).
– , , , , и – классы, предоставляющие "системные операции", управляющие динамической загрузкой классов, созданием внешних процессов, запросами к среде хоста, например, текущее время, и обеспечением соблюдения политик безопасности.
– и – классы, предоставляющие основные математические функции, такие как синус, косинус и квадратный корень (StrictMath начиная с J2SE 1.3).
Примитивные классы-обертки, инкапсулирующие примитивные типы в объекты. Базовые классы исключений, выбрасываемые для исключений уровня языка и других распространенных исключений. Классы в `java.lang` автоматически импортируются во все исходные файлы.

java.lang.ref

Пакет предоставляет более гибкие типы ссылок, чем доступны в иных случаях, позволяя ограниченное взаимодействие между приложением и сборщиком мусора Java Virtual Machine (JVM). Это важный пакет, настолько центральный для языка, что разработчики языка дали ему имя, начинающееся с "java.lang", но он имеет несколько специализированное назначение и не используется многими разработчиками. Этот пакет был добавлен в J2SE 1.2. Java обладает выразительной системой ссылок и позволяет задавать специальное поведение для сборки мусора. Обычная ссылка в Java известна как "сильная ссылка". Пакет java.lang.ref определяет три других типа ссылок: мягкие, слабые и фантомные ссылки. Каждый тип ссылок предназначен для конкретного использования. Мягкая ссылка может быть использована для реализации кэша. Объект, который недоступен по сильной ссылке (то есть не является сильно достижимым), но на который ссылается мягкая ссылка, называется "мягко достижимым". Объект, являющийся мягко достижимым, может быть собран сборщиком мусора по его усмотрению. Обычно это означает, что мягко достижимые объекты собираются только при низком объеме свободной памяти, но, повторюсь, это остается на усмотрение сборщика мусора. Семантически, мягкая ссылка означает: "Сохраняйте этот объект, пока на него не ссылаются другие объекты, если память не требуется". Слабая ссылка используется для реализации слабых карт. Объект, который не является сильно или мягко достижимым, но на который ссылается слабая ссылка, называется "слабо достижимым". Слабо достижимый объект собирается в следующем цикле сборки мусора. Такое поведение используется в классе WeakMap. Слабая карта позволяет программисту помещать пары "ключ/значение" в карту, не беспокоясь о том, что объекты будут занимать память, когда ключ больше нигде не будет доступен. Другим возможным применением слабых ссылок является пул статических строк. Семантически слабая ссылка означает: "Удалите этот объект, когда на него больше никто не ссылается при следующей сборке мусора". Фантомная ссылка используется для ссылки на объекты, которые были помечены для сборки мусора и были завершены, но еще не освобождены. Объект, который не является сильно, мягко или слабо достижимым, но на который ссылается фантомная ссылка, называется "фантомно достижимым". Это обеспечивает более гибкую очистку, чем это возможно только с помощью механизма финализации. Семантически фантомная ссылка означает: "Этот объект больше не нужен и был завершен в подготовку к сборке". Каждый из этих типов ссылок расширяет класс Reference, который предоставляет метод get() для возврата сильной ссылки на референтный объект (или null, если ссылка была очищена или если тип ссылки является фантомным) и метод clear() для очистки ссылки. java.lang.ref также определяет класс ReferenceQueue, который может использоваться во всех рассмотренных выше приложениях для отслеживания объектов, изменивших тип ссылки. При создании Reference она опционально регистрируется в ссылочной очереди. Приложение опрашивает ссылочную очередь для получения ссылок, изменивших состояние доступности.

java.lang.reflect

Рефлексия — это составная часть Java API, позволяющая Java-коду исследовать и "отражать" Java-компоненты во время выполнения и использовать отраженные члены. Классы в этом пакете, а также `java.lang.Class`, поддерживают приложения, такие как отладчики, интерпретаторы, инспекторы объектов, обозреватели классов и сервисы, такие как сериализация объектов и JavaBeans, которым требуется доступ либо к публичным членам целевого объекта (на основе его класса во время выполнения), либо к членам, объявленным данным классом. Этот пакет был добавлен в JDK 1.1. Рефлексия используется для создания экземпляров классов и вызова методов по их именам, что позволяет реализовать динамическое программирование. Классы, интерфейсы, методы, поля и конструкторы могут быть обнаружены и использованы во время выполнения. Рефлексия поддерживается метаданными, которые JVM хранит о программе.

Использование по названию

Объект класса может быть получен либо посредством обнаружения, либо с использованием литерала класса (например, MyClass.class) или по имени класса (например, ). С помощью объекта класса можно получить объекты-члены – Method, Constructor или Field – используя символическое имя члена. Например:
– возвращает объект Method, представляющий публичный метод с именем "methodName" класса или интерфейса, принимающий параметры, указанные параметрами Class. – возвращает объект Constructor, представляющий публичный конструктор класса, принимающий параметры, указанные параметрами Class. – возвращает объект Field, представляющий публичное поле с именем "fieldName" класса или интерфейса. Объекты Method, Constructor и Field можно использовать для динамического доступа к соответствующему члену класса. Например:
– возвращает объект, содержащий значение поля из экземпляра объекта, переданного в метод get. (Если объект Field представляет собой статическое поле, то параметр Object игнорируется и может быть null.) – возвращает объект, содержащий результат вызова метода для экземпляра объекта, переданного в метод invoke. Оставшиеся параметры Object передаются методу. (Если объект Method представляет собой статический метод, то первый параметр Object игнорируется и может быть null.) – возвращает новый экземпляр объекта, созданный при вызове конструктора. Параметры Object передаются конструктору. (Обратите внимание, что конструктор без параметров класса также можно вызвать, используя .)

Массивы и прокси-серверы

Пакет java.lang.reflect также предоставляет класс, содержащий статические методы для создания и манипулирования объектами массивов, а начиная с J2SE 1.3 – класс, поддерживающий динамическое создание прокси-классов, реализующих указанные интерфейсы. Реализация прокси-класса обеспечивается объектом, реализующим интерфейс InvocationHandler. Метод invoke интерфейса InvocationHandler вызывается для каждого метода, вызванного у прокси-объекта: первый параметр – сам прокси-объект, второй параметр – объект Method, представляющий метод из интерфейса, реализованного прокси, а третий параметр – массив параметров, переданных методу интерфейса. Метод invoke возвращает объект Object, содержащий результат, возвращаемый коду, вызвавшему метод прокси-интерфейса.

java.io

Пакет содержит классы, обеспечивающие ввод и вывод данных. Классы в пакете преимущественно ориентированы на потоки, однако также предусмотрен класс для работы с файлами произвольного доступа. Центральными классами пакета являются и , которые представляют собой абстрактные базовые классы для чтения и записи байтовых потоков соответственно. Связанные классы и являются абстрактными базовыми классами для чтения и записи символьных потоков соответственно. Пакет также включает несколько дополнительных классов для поддержки взаимодействия с файловой системой хоста.

Случайный доступ

Класс поддерживает произвольный доступ для чтения и записи файлов. Класс использует указатель файла, представляющий собой смещение в байтах внутри файла для следующей операции чтения или записи. Указатель файла перемещается неявно при чтении или записи и явно при вызове методов `seek` или `tell`. Текущая позиция указателя файла возвращается методом `tell`.

Файловая система

Класс представляет путь к файлу или каталогу в файловой системе. Объекты файлов поддерживают создание, удаление и переименование файлов и каталогов, а также изменение атрибутов файлов, таких как режим "только для чтения" и метка времени последнего изменения. Объекты файлов, представляющие каталоги, могут использоваться для получения списка всех содержащихся в них файлов и каталогов. Класс `FileDescriptor` — это дескриптор файла, представляющий источник или приемник (назначение) байтов. Обычно это файл, но также может быть консоль или сетевой сокет. Объекты `FileDescriptor` используются для создания потоков файлов. Они получаются из потоков файлов, а также из сокетов и датаграммных сокетов Java.

java.nio

В J2SE 1.4 был добавлен пакет (NIO или Non-blocking I/O) для поддержки ввода-вывода с отображением в память, что облегчает выполнение операций ввода-вывода ближе к аппаратному обеспечению и иногда значительно повышает производительность. Пакет java.nio предоставляет поддержку нескольких типов буферов. Подпакет предоставляет поддержку различных кодировок символов для символьных данных. Подпакет предоставляет поддержку каналов, которые представляют собой соединения с сущностями, способными выполнять операции ввода-вывода, такими как файлы и сокеты. Пакет java.nio.channels также предоставляет поддержку гранулярной блокировки файлов.

Java.math

Пакет поддерживает многоточную арифметику (включая модульные арифметические операции) и предоставляет многоточные генераторы простых чисел, используемые для генерации криптографических ключей. Основные классы пакета:

– обеспечивает числа с произвольной точностью в десятичном формате со знаком. BigDecimal предоставляет пользователю контроль над поведением округления через RoundingMode. – обеспечивает целые числа с произвольной точностью. Операции над BigInteger не приводят к переполнению или потере точности. Помимо стандартных арифметических операций, он предоставляет модульную арифметику, вычисление НОД, проверку простоты, генерацию простых чисел, манипулирование битами и другие вспомогательные операции. – инкапсулирует контекстные настройки, описывающие определенные правила для числовых операторов. – перечисление, предоставляющее восемь режимов округления.

java.net

Пакет предоставляет специальные функции ввода-вывода для работы с сетями, обеспечивая возможность отправки HTTP-запросов и выполнения других распространенных операций.

java.text (на английском языке)

Пакет реализует процедуры разбора строк и поддерживает различные языки, удобные для чтения, а также разбор, учитывающий локальные особенности.

java.util

Структуры данных, объединяющие объекты, являются основной темой данного пакета. Пакет включает в себя Collections API – упорядоченную иерархию структур данных, в проектировании которой большое внимание уделено паттернам проектирования.

java.applet (англ.) (недоступная ссылка)

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

Яванская фасоль

В пакет включены различные классы для разработки и манипулирования бинами, многократно используемые компоненты, определенные архитектурой JavaBeans. Архитектура предоставляет механизмы для манипулирования свойствами компонентов и генерации событий при изменении этих свойств. API в пакете java.beans предназначены для использования в инструментах редактирования бинов, где бины могут быть объединены, настроены и изменены. Одним из типов редакторов бинов является графический дизайнер в интегрированной среде разработки.

java.awt

Abstract Window Toolkit (AWT) предоставляет доступ к базовому набору виджетов графического интерфейса, основанному на наборе виджетов базовой платформы, ядру подсистемы обработки событий графического интерфейса и интерфейсу между нативной оконной системой и Java-приложением. Он также предоставляет несколько основных менеджеров компоновки, пакет для передачи данных, используемый с буфером обмена и Drag and Drop, интерфейс для устройств ввода, таких как мыши и клавиатуры, а также доступ к системному трею на поддерживающих системах. Этот пакет, вместе с javax.swing, содержит наибольшее количество перечислений (всего 7) в JDK 6.

java.rmi

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

java.security (язык для безопасности)

Поддержка безопасности, включая алгоритм вычисления дайджеста сообщений, включена в пакет.

java.sql

Реализация API JDBC (используемая для доступа к базам данных SQL) объединена в пакет.

javax.swing (в переводе с английского)

Swing — это набор программных модулей, построенный на основе java.awt, предоставляющий платформенно-независимый инструментарий виджетов. Он использует двухмерные процедуры рисования для отображения компонентов пользовательского интерфейса, вместо того чтобы полагаться на встроенную поддержку графического интерфейса операционной системы. Этот пакет содержит наибольшее количество классов (всего 133) в JDK 6. Вместе с java.awt, этот пакет также содержит наибольшее количество перечислений (всего 7) в JDK 6. Он поддерживает подключаемые стили оформления (PLAF), позволяя виджетам графического интерфейса имитировать виджеты базовой операционной системы. В системе широко используются шаблоны проектирования, особенно модификация шаблона «модель-представление-контроллер», которая ослабляет связь между функциональностью и внешним видом. Одно несоответствие заключается в том, что (по состоянию на J2SE 1.3) шрифты отрисовываются базовой операционной системой, а не Java, что ограничивает переносимость текста. Существуют обходные решения, такие как использование растровых шрифтов. В целом, используются "макеты", которые обеспечивают эстетически согласованный графический интерфейс на разных платформах.

javax.swing.text.html.parser (проверка текста)

Пакет предоставляет HTML-парсер, устойчивый к ошибкам, который используется при разработке различных веб-браузеров и веб-ботов.

javax.xml.bind.annotation (полное объяснение)

Пакет javax.xml.bind.annotation содержал наибольшее количество типов аннотаций (всего 30) в JDK 6. Он определяет аннотации для настройки элементов программы на Java для сопоставления со схемой XML.

Орг.Омг.Корба

Организация OMG. Пакет CORBA обеспечивал поддержку удаленного взаимодействия между приложениями с использованием протокола General Inter-ORB и поддерживал другие возможности архитектуры универсального брокера объектов. Как и RMI и RMI/IIOP, этот пакет предназначен для вызова удаленных методов объектов на других виртуальных машинах (обычно по сети). В JDK 6 этот пакет содержал наибольшее количество классов исключений – всего 45. Среди всех способов взаимодействия CORBA обеспечивает переносимость между различными языками программирования, однако это сопряжено с большей сложностью. Эти пакеты устарели в Java 9 и были удалены из Java 11.

Портативный перехватчик

Пакет org.omg.PortableInterceptor содержал наибольшее количество интерфейсов (всего 39) в JDK 6. Он предоставляет механизм регистрации перехватчиков ORB, посредством которых службы ORB перехватывают нормальный ход выполнения ORB.

Безопасность

Сообщается о нескольких критических уязвимостях в области безопасности. Oracle выпустила предупреждения о безопасности, объявляющие о критических обновлениях безопасности для Java SE.