Java Platform, Standard Edition ( Java SE ) — вычислительная платформа для разработки и развертывания переносимого кода для настольных и серверных сред. [1] Java SE ранее была известна как Java 2 Platform, Standard Edition ( J2SE ).
Платформа использует язык программирования Java и является частью семейства программных платформ Java . Java SE определяет ряд API общего назначения — таких как API Java для библиотеки классов Java — а также включает спецификацию языка Java и спецификацию виртуальной машины Java . [2] OpenJDK является официальной эталонной реализацией с версии 7. [3] [4] [5]
Платформа была известна как Java 2 Platform, Standard Edition или J2SE с версии 1.2, пока название не было изменено на Java Platform, Standard Edition или Java SE в версии 1.5. «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) . [6] 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) — это родственная спецификация, призванная предоставить сертифицированный набор API Java для разработки программного обеспечения для небольших устройств с ограниченными ресурсами, таких как мобильные телефоны , КПК и телевизионные приставки .
Java Runtime Environment (JRE) и Java Development Kit (JDK) — это фактические файлы, загружаемые и устанавливаемые на компьютер для запуска или разработки программ Java соответственно.
Пакет Java java.lang
содержит фундаментальные классы и интерфейсы, тесно связанные с языком и системой времени выполнения . Сюда входят корневые классы, которые формируют иерархию классов , типы, привязанные к определению языка, основные исключения , математические функции, потоки , функции безопасности, а также некоторая информация о базовой собственной системе. Этот пакет содержит 22 из 32 Error
классов, предоставленных в JDK 6.
Основные классы и интерфейсы java.lang
:
Object
– класс, являющийся корнем каждой иерархии классов.Enum
– базовый класс для классов перечисления (начиная с J2SE 5.0).Class
– класс, являющийся корнем системы рефлексии Java .Throwable
– класс, являющийся базовым классом иерархии классов исключений.Error
, Exception
, и RuntimeException
– базовые классы для каждого типа исключения.Thread
– класс, позволяющий выполнять операции над потоками.String
– класс для строк и строковых литералов .StringBuffer
и StringBuilder
– классы для выполнения манипуляций со строками ( StringBuilder
начиная с J2SE 5.0).Comparable
– интерфейс, позволяющий выполнять общее сравнение и упорядочивание объектов (начиная с J2SE 1.2).Iterable
– интерфейс, позволяющий выполнять универсальную итерацию с использованием расширенного for
цикла (начиная с J2SE 5.0).ClassLoader
, Process
, Runtime
, SecurityManager
, и System
– классы, которые предоставляют «системные операции», управляющие динамической загрузкой классов, созданием внешних процессов , запросами хост-среды, такими как время суток, и применением политик безопасности .Math
и StrictMath
– классы, предоставляющие основные математические функции, такие как синус , косинус и квадратный корень ( StrictMath
начиная с J2SE 1.3).Классы java.lang
автоматически импортируются в каждый исходный файл .
Пакет java.lang.ref
предоставляет более гибкие типы ссылок, чем доступные в противном случае, что позволяет ограниченное взаимодействие между приложением и сборщиком мусора Java Virtual Machine (JVM) . Это важный пакет, достаточно центральный для языка, чтобы разработчики языка дали ему имя, начинающееся с "java.lang", но он несколько специализирован и не используется многими разработчиками. Этот пакет был добавлен в J2SE 1.2.
Java имеет выразительную систему ссылок и допускает особое поведение для сборки мусора. Обычная ссылка в Java известна как «сильная ссылка». java.lang.ref
Пакет определяет три других типа ссылок — мягкие, слабые и фантомные ссылки. Каждый тип ссылки предназначен для определенного использования.
SoftReference
может быть использован для реализации кэша . Объект, который недоступен по сильной ссылке (то есть не является строго достижимым), но на который ссылается мягкая ссылка, называется «мягко достижимым». Мягко достижимый объект может быть собран мусором по усмотрению сборщика мусора. Это обычно означает, что мягко достижимые объекты собираются мусором только при низком уровне свободной памяти, но, опять же, это остается на усмотрение сборщика мусора. Семантически мягкая ссылка означает: «Сохраняйте этот объект, когда на него больше ничего не ссылается, если только память не нужна».WeakReference
используется для реализации слабых карт. Объект, который не является строго или мягко достижимым, но на который ссылается слабая ссылка, называется « слабо достижимым ». Слабо достижимый объект собирается мусором в следующем цикле сбора. Такое поведение используется в классе java.util.WeakHashMap
. Слабая карта позволяет программисту помещать пары ключ/значение в карту и не беспокоиться о том, что объекты занимают память, когда ключ больше не доступен нигде. Другим возможным применением слабых ссылок является строковый пул интернирования . Семантически слабая ссылка означает «избавиться от этого объекта, когда на него больше ничего не ссылается при следующей сборке мусора».PhantomReference
используется для ссылки на объекты, которые были помечены для сбора мусора и были финализированы , но еще не были утилизированы. Объект, который не является строго, мягко или слабо достижимым, но на который ссылается фантомная ссылка, называется «фантомно достижимым». Это позволяет производить более гибкую очистку, чем это возможно с помощью одного только механизма финализации. Семантически фантомная ссылка означает «этот объект больше не нужен и был финализирован в рамках подготовки к сбору».Каждый из этих ссылочных типов расширяет Reference
класс, который предоставляет get()
метод для возврата строгой ссылки на объект ссылки (или null
если ссылка была очищена, или если тип ссылки является фантомным), а также clear()
метод для очистки ссылки.
Также java.lang.ref
определяет класс ReferenceQueue
, который может использоваться в каждом из приложений, обсуждавшихся выше, для отслеживания объектов, изменивших тип ссылки. При Reference
создании он опционально регистрируется в очереди ссылок. Приложение опрашивает очередь ссылок, чтобы получить ссылки, изменившие состояние достижимости.
Reflection — это составная часть Java API, которая позволяет Java-коду проверять и «отражать» компоненты Java во время выполнения и использовать отраженные члены. Классы в пакете, а java.lang.reflect
также размещают такие приложения, как отладчики , интерпретаторы , инспекторы объектов, браузеры классов и службы, такие как сериализация объектов и JavaBeans , которым требуется доступ либо к открытым членам целевого объекта (на основе его класса времени выполнения), либо к членам, объявленным данным классом. Этот пакет был добавлен в JDK 1.1.java.lang.Class
java.lang.Package
Рефлексия используется для создания экземпляров классов и вызова методов с использованием их имен, концепция, которая допускает динамическое программирование. Классы, интерфейсы, методы, поля и конструкторы могут быть обнаружены и использованы во время выполнения. Рефлексия поддерживается метаданными, которые JVM имеет о программе.
В рефлексии задействованы следующие основные приемы:
Обычно обнаружение начинается с объекта и вызова Object.getClass()
метода для получения объекта Class
. Class
У объекта есть несколько методов для обнаружения содержимого класса, например:
getMethods()
– возвращает массив Method
объектов, представляющих все публичные методы класса или интерфейсаgetConstructors()
– возвращает массив Constructor
объектов, представляющих все публичные конструкторы классаgetFields()
– возвращает массив Field
объектов, представляющих все открытые поля класса или интерфейсаgetClasses()
– возвращает массив Class
объектов, представляющих все открытые классы и интерфейсы, которые являются членами (например, внутренние классы ) класса или интерфейсаgetSuperclass()
– возвращает Class
объект, представляющий суперкласс класса или интерфейса ( null
возвращается для интерфейсов)getInterfaces()
– возвращает массив Class
объектов, представляющих все интерфейсы, которые реализованы классом или интерфейсомОбъект Class
может быть получен либо через обнаружение, либо с помощью литерала класса (например MyClass.class
), либо с помощью имени класса (например Class.forName("mypackage.MyClass")
). С Class
объектом, членом Method
, Constructor
или Field
объекты могут быть получены с помощью символического имени члена. Например:
getMethod("methodName", Class...)
– возвращает Method
объект, представляющий открытый метод с именем «methodName» класса или интерфейса, который принимает параметры, указанные параметрами Class...
.getConstructor(Class...)
– возвращает Constructor
объект, представляющий открытый конструктор класса, который принимает параметры, указанные параметрами Class...
.getField("fieldName")
– возвращает Field
объект, представляющий публичное поле с именем «fieldName» класса или интерфейса.Method
, Constructor
, и Field
объекты могут использоваться для динамического доступа к представленному члену класса. Например:
Field.get(Object)
– возвращает , Object
содержащий значение поля из экземпляра объекта, переданного в get()
. (Если Field
объект представляет статическое поле, то Object
параметр игнорируется и может быть null
.)Method.invoke(Object, Object...)
– возвращает Object
содержащий результат вызова метода для экземпляра первого Object
параметра, переданного в invoke()
. Оставшиеся Object...
параметры передаются в метод. (Если Method
объект представляет статический метод , то первый Object
параметр игнорируется и может быть null
.)Constructor.newInstance(Object...)
– возвращает новый Object
экземпляр из вызова конструктора. Object...
Параметры передаются конструктору. (Обратите внимание, что конструктор без параметров для класса также может быть вызван вызовом newInstance()
.)Пакет java.lang.reflect
также предоставляет Array
класс, содержащий статические методы для создания и управления объектами массива, а начиная с J2SE 1.3 — Proxy
класс, поддерживающий динамическое создание прокси-классов, реализующих указанные интерфейсы.
Реализация класса Proxy
обеспечивается предоставленным объектом, реализующим InvocationHandler
интерфейс. Метод InvocationHandler
's invoke(Object, Method, Object[])
вызывается для каждого метода, вызываемого на объекте-прокси: первый параметр — объект-прокси, второй параметр — Method
объект, представляющий метод из интерфейса, реализованного прокси, а третий параметр — массив параметров, переданных методу интерфейса. invoke()
Метод возвращает Object
результат, содержащий результат, возвращенный коду, вызвавшему метод интерфейса-прокси.
Пакет java.io
содержит классы, которые поддерживают ввод и вывод . Классы в пакете в основном ориентированы на потоки ; однако также предоставляется класс для файлов с произвольным доступом . Центральными классами в пакете являются и , которые являются абстрактными базовыми классами для чтения из потоков байтов и записи в них соответственно. Связанные классы и являются абстрактными базовыми классами для чтения из потоков символов и записи в них соответственно. В пакете также есть несколько различных классов для поддержки взаимодействия с файловой системой хоста .InputStream
OutputStream
Reader
Writer
Классы потоков следуют шаблону декоратора , расширяя базовый подкласс для добавления функций к классам потоков. Подклассы базовых классов потоков обычно именуются по одному из следующих атрибутов:
Подклассы потоков именуются с использованием шаблона XxxStreamType
именования , где Xxx
— имя, описывающее функцию, и StreamType
может быть одним из InputStream
: , OutputStream
, Reader
, или Writer
.
В следующей таблице показаны источники/назначения, поддерживаемые непосредственно пакетом java.io
:
Другие стандартные библиотечные пакеты предоставляют потоковые реализации для других назначений, таких как InputStream
возвращаемые методом java.net.Socket.getInputStream()
или классом Java EE javax.servlet.ServletOutputStream
.
Обработка и фильтрация потоковых данных с использованием типов данных выполняется с помощью потоковых фильтров . Все классы фильтров принимают другой совместимый потоковый объект в качестве параметра конструктора и украшают вложенный поток дополнительными функциями. Фильтры создаются путем расширения одного из базовых классов фильтров FilterInputStream
, FilterOutputStream
, FilterReader
, или FilterWriter
.
Классы Reader
и Writer
на самом деле являются просто потоками байтов с дополнительной обработкой, выполняемой над потоком данных для преобразования байтов в символы. Они используют кодировку символов по умолчанию для платформы, которая с J2SE 5.0 представлена Charset
возвращаемым java.nio.charset.Charset.defaultCharset()
статическим методом. InputStreamReader
Класс преобразует InputStream
в , Reader
а OutputStreamWriter
класс преобразует OutputStream
в Writer
. Оба этих класса имеют конструкторы, которые поддерживают указание используемой кодировки символов. Если кодировка не указана, программа использует кодировку по умолчанию для платформы.
В следующей таблице показаны другие процессы и фильтры, которые java.io
пакет поддерживает напрямую. Все эти классы расширяют соответствующий Filter
класс.
Класс RandomAccessFile
поддерживает чтение и запись файлов с произвольным доступом . Класс использует указатель файла , который представляет смещение байта в файле для следующей операции чтения или записи. Указатель файла перемещается неявно при чтении или записи и явно при вызове методов seek(long)
или skipBytes(int)
. Текущая позиция указателя файла возвращается методом getFilePointer()
.
Класс File
представляет путь к файлу или каталогу в файловой системе . Объекты поддерживают создание, удаление и переименование файлов и каталогов, а также манипулирование атрибутами файлов, такими как « только для чтения» и «отметка времени последнего изменения» . Объекты, представляющие каталоги, можно использовать для получения списка всех содержащихся файлов и каталогов.File
File
Класс FileDescriptor
— это файловый дескриптор , представляющий источник или приемник (место назначения) байтов. Обычно это файл, но также может быть консольный или сетевой сокет . FileDescriptor
объекты используются для создания File
потоков. Они получаются из File
потоков и java.net
сокетов и сокетов датаграмм.
java.nio
В J2SE 1.4 был добавлен пакет (NIO или Non-blocking I/O) для поддержки ввода-вывода с отображением в памяти , что упрощает операции ввода-вывода ближе к базовому оборудованию с иногда значительно более высокой производительностью. java.nio
Пакет обеспечивает поддержку ряда типов буферов. Подпакет java.nio.charset
обеспечивает поддержку различных кодировок символов для символьных данных. Подпакет java.nio.channels
обеспечивает поддержку каналов, которые представляют собой соединения с сущностями, способными выполнять операции ввода-вывода, такими как файлы и сокеты. java.nio.channels
Пакет также обеспечивает поддержку мелкозернистой блокировки файлов.
Пакет java.math
поддерживает арифметику с множественной точностью (включая модульные арифметические операции) и предоставляет генераторы простых чисел с множественной точностью, используемые для генерации криптографических ключей. Основные классы пакета:
BigDecimal
– обеспечивает произвольную точность знаковых десятичных чисел. BigDecimal
дает пользователю контроль над поведением округления с помощью RoundingMode
.BigInteger
– предоставляет целые числа произвольной точности. Операции BigInteger
не переполняются и не теряют точность. В дополнение к стандартным арифметическим операциям, он предоставляет модульную арифметику , вычисление НОД , проверку простоты , генерацию простых чисел , манипуляцию битами и другие разнообразные операции.MathContext
– инкапсулируют настройки контекста, описывающие определенные правила для числовых операторов.RoundingMode
– перечисление, которое обеспечивает восемь вариантов округления.Пакет java.net
предоставляет специальные процедуры ввода-вывода для сетей, позволяющие выполнять HTTP- запросы, а также другие распространенные транзакции.
Пакет java.text
реализует процедуры синтаксического анализа строк и поддерживает различные языки, понятные человеку, а также синтаксический анализ, зависящий от локали.
Структуры данных , которые объединяют объекты, являются фокусом пакета java.util
. В пакет включен API Коллекций , организованная иерархия структур данных, на которую сильное влияние оказали соображения шаблонов проектирования .
Созданный для поддержки создания Java-апплетов , java.applet
пакет позволяет загружать приложения по сети и запускать их в защищенной песочнице. Ограничения безопасности легко налагаются на песочницу. Например, разработчик может применить цифровую подпись к апплету, тем самым обозначив его как безопасный. Это позволяет пользователю предоставить апплету разрешение на выполнение ограниченных операций (например, доступ к локальному жесткому диску) и снимает некоторые или все ограничения песочницы. Цифровые сертификаты выдаются центрами сертификации .
В java.beans
пакет включены различные классы для разработки и управления компонентами, повторно используемыми компонентами, определенными архитектурой JavaBeans . Архитектура предоставляет механизмы для управления свойствами компонентов и запуска событий при изменении этих свойств.
API в java.beans
предназначены для использования инструментом редактирования bean-компонентов, в котором bean-компоненты могут быть объединены, настроены и обработаны. Один из типов редактора bean-компонентов — это GUI- дизайнер в интегрированной среде разработки .
, или Abstract Window Toolkit java.awt
, предоставляет доступ к базовому набору виджетов GUI на основе набора виджетов базовой собственной платформы, ядру подсистемы событий GUI и интерфейсу между собственной оконной системой и приложением Java. Он также предоставляет несколько базовых менеджеров макетов , пакет передачи данных для использования с буфером обмена и Drag and Drop , интерфейс для устройств ввода, таких как мыши и клавиатуры , а также доступ к системному трею на поддерживающих системах. Этот пакет, а также javax.swing
содержит наибольшее количество перечислений (всего 7) в JDK 6.
Пакет java.rmi
обеспечивает удаленный вызов методов Java для поддержки удаленных вызовов процедур между двумя приложениями Java, работающими на разных JVM .
java.security
В пакет включена поддержка безопасности, включая алгоритм дайджеста сообщений .
Реализация API JDBC (используется для доступа к базам данных SQL ) сгруппирована в пакет.java.sql
Пакет javax.rmi
обеспечивал поддержку удаленной связи между приложениями с использованием протокола RMI over IIOP. Этот протокол объединяет возможности RMI и CORBA.
Основные технологии Java SE — CORBA/RMI-IIOP
Swing — это набор процедур, которые создают java.awt
независимый от платформы набор инструментов для виджетов . javax.swing
Использует процедуры 2D-рисования для визуализации компонентов пользовательского интерфейса вместо того, чтобы полагаться на поддержку базового графического интерфейса операционной системы .
Этот пакет содержит наибольшее количество классов (всего 133) в JDK 6. Этот пакет, а также java.awt
содержит наибольшее количество перечислений (всего 7) в JDK 6. Он поддерживает подключаемые образы и ощущения (PLAF), так что виджеты в GUI могут имитировать вид из базовой нативной системы. Шаблоны проектирования пронизывают систему, особенно модификация шаблона модель–представление–контроллер , которая ослабляет связь между функцией и внешним видом. Одно из противоречий заключается в том, что (начиная с J2SE 1.3) шрифты рисуются базовой нативной системой, а не Java, что ограничивает переносимость текста. Существуют обходные пути, такие как использование растровых шрифтов. В общем, используются «макеты», которые сохраняют элементы в эстетически согласованном GUI на разных платформах.
Пакет javax.swing.text.html.parser
предоставляет устойчивый к ошибкам HTML-парсер, который используется для написания различных веб-браузеров и веб-ботов.
Пакет javax.xml.bind.annotation
содержал наибольшее количество типов аннотаций (всего 30) в JDK 6. Он определяет аннотации для настройки элементов программы Java для отображения схемы XML.
Пакет org.omg.CORBA
обеспечивает поддержку удаленной связи между приложениями с использованием протокола General Inter-ORB и поддерживает другие функции архитектуры брокера общих запросов объектов . Как и RMI и RMI-IIOP , этот пакет предназначен для вызова удаленных методов объектов на других виртуальных машинах (обычно через сеть).
Этот пакет содержал наибольшее количество Exception
классов (всего 45) в JDK 6. Из всех возможностей коммуникации CORBA является переносимой между различными языками; однако с этим связана большая сложность.
Эти пакеты были объявлены устаревшими в Java 9 и удалены из Java 11. [7]
Пакет org.omg.PortableInterceptor
содержал наибольшее количество интерфейсов (всего 39) в JDK 6. Он предоставляет механизм регистрации хуков ORB, посредством которых службы ORB перехватывают нормальный поток выполнения ORB.
Было сообщено о нескольких критических уязвимостях безопасности. [8] [9] Оповещения безопасности от Oracle сообщают о критических исправлениях безопасности для Java SE. [10]