Java Platform, Standard Edition ( Java SE ) — это вычислительная платформа для разработки и развертывания переносимого кода для настольных и серверных сред. [1] Java SE ранее была известна как платформа Java 2 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 , который создает описания предлагаемых и окончательных спецификаций для платформы Java, называемые запросами спецификации Java (JSR) . [6] JSR 59 была базовой спецификацией для J2SE 1.4, а JSR 176 определяла J2SE 5.0 (Tiger). Java SE 6 (Mustang) была выпущена под номером JSR 270.
Платформа Java Enterprise Edition (Java EE) — это связанная спецификация, включающая все классы Java SE, а также ряд классов, которые более полезны для программ, работающих на серверах , а не на рабочих станциях .
Платформа Java, Micro Edition (Java ME) — это связанная спецификация, предназначенная для предоставления сертифицированного набора API-интерфейсов Java для разработки программного обеспечения для небольших устройств с ограниченными ресурсами, таких как сотовые телефоны , КПК и телеприставки .
Среда выполнения Java (JRE) и комплект разработки Java (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 (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
создании он дополнительно регистрируется в ссылочной очереди. Приложение опрашивает очередь ссылок, чтобы получить ссылки, которые изменили состояние доступности.
Отражение — это составная часть Java API, которая позволяет коду Java проверять и «размышлять» над компонентами Java во время выполнения и использовать отраженные члены. Классы в java.lang.reflect
пакете вместе с такими приложениями, java.lang.Class
как java.lang.Package
отладчики , интерпретаторы , инспекторы объектов, браузеры классов и службы, такие как сериализация объектов и JavaBeans , которым необходим доступ либо к общедоступным членам целевого объекта (на основе его класса времени выполнения), либо к ним. члены, объявленные данным классом. Этот пакет был добавлен в JDK 1.1.
Отражение используется для создания экземпляров классов и вызова методов с использованием их имен — концепция, позволяющая осуществлять динамическое программирование. Классы, интерфейсы, методы, поля и конструкторы можно обнаружить и использовать во время выполнения. Отражение поддерживается метаданными , которые 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
объектаmember Method
, Constructor
или Field
объекты можно получить, используя символическое имя члена. Например:
getMethod("methodName", Class...)
– возвращает Method
объект, представляющий общедоступный метод с именем «имя_метода» класса или интерфейса, который принимает параметры, указанные в параметрах 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
and Writer
на самом деле представляют собой просто потоки байтов с дополнительной обработкой потока данных для преобразования байтов в символы. Они используют кодировку символов по умолчанию для платформы, которая, начиная с J2SE 5.0, представлена возвращаемым Charset
статическим java.nio.charset.Charset.defaultCharset()
методом. Класс InputStreamReader
преобразует a InputStream
в a Reader
, а OutputStreamWriter
класс преобразует a OutputStream
в a Writer
. Оба этих класса имеют конструкторы, которые поддерживают указание используемой кодировки символов. Если кодировка не указана, программа использует кодировку по умолчанию для платформы.
В следующей таблице показаны другие процессы и фильтры, которые java.io
напрямую поддерживает пакет. Все эти классы расширяют соответствующий Filter
класс.
Класс RandomAccessFile
поддерживает произвольное чтение и запись файлов. Класс использует указатель файла , который представляет смещение в байтах внутри файла для следующей операции чтения или записи. Указатель файла перемещается неявно при чтении или записи и явно при вызове методов seek(long)
или skipBytes(int)
. Текущая позиция указателя файла возвращается методом getFilePointer()
.
Класс File
представляет путь к файлу или каталогу в файловой системе . объекты поддерживают создание, удаление и переименование файлов и каталогов, а также манипулирование атрибутами файлов , такими как « только для чтения» и временная метка последнего изменения . объекты, представляющие каталоги, можно использовать для получения списка всех содержащихся в них файлов и каталогов.File
File
Класс FileDescriptor
— это файловый дескриптор , который представляет источник или приемник (назначение) байтов. Обычно это файл, но также может быть консольный или сетевой сокет . FileDescriptor
объекты используются для создания File
потоков. Они получаются из File
потоков, java.net
сокетов и сокетов датаграмм.
В J2SE 1.4 был добавлен пакет java.nio
(NIO или неблокирующий ввод-вывод) для поддержки ввода -вывода с отображением в памяти , что облегчает операции ввода-вывода ближе к базовому оборудованию с иногда значительно большей производительностью. Пакет java.nio
обеспечивает поддержку ряда типов буферов. Подпакет java.nio.charset
обеспечивает поддержку различных кодировок символов для символьных данных. Подпакет java.nio.channels
обеспечивает поддержку каналов, которые представляют соединения с объектами, способными выполнять операции ввода-вывода, такими как файлы и сокеты. Пакет java.nio.channels
также обеспечивает поддержку детальной блокировки файлов.
Пакет java.math
поддерживает арифметику с множественной точностью (включая модульные арифметические операции) и предоставляет генераторы простых чисел с множественной точностью, используемые для генерации криптографических ключей. Основные классы пакета:
BigDecimal
– предоставляет десятичные числа со знаком произвольной точности. BigDecimal
дает пользователю контроль над поведением округления через RoundingMode
.BigInteger
– предоставляет целые числа произвольной точности. Операции on BigInteger
не переполняются и не теряют точности. В дополнение к стандартным арифметическим операциям он обеспечивает модульную арифметику , вычисление НОД , проверку простоты , генерацию простых чисел , манипуляции с битами и другие разные операции.MathContext
– инкапсулировать настройки контекста, описывающие определенные правила для числовых операторов.RoundingMode
– перечисление, обеспечивающее восемь вариантов округления.Пакет java.net
предоставляет специальные процедуры ввода-вывода для сетей, позволяющие выполнять HTTP- запросы, а также другие распространенные транзакции.
Пакет java.text
реализует процедуры синтаксического анализа строк и поддерживает различные удобочитаемые языки и синтаксический анализ с учетом локали.
Структуры данных , объединяющие объекты, находятся в центре внимания пакета java.util
. В пакет включен API коллекций — организованная иерархия структур данных, на которую во многом влияют соображения шаблонов проектирования .
Созданный для поддержки создания Java-апплетов , java.applet
пакет позволяет загружать приложения по сети и запускать их в защищенной изолированной программной среде. Ограничения безопасности легко накладываются на песочницу. Например, разработчик может применить к апплету цифровую подпись , тем самым пометив его как безопасный. Это позволяет пользователю предоставить апплету разрешение на выполнение ограниченных операций (например, доступ к локальному жесткому диску) и снимает некоторые или все ограничения изолированной программной среды. Цифровые сертификаты выдаются центрами сертификации .
В java.beans
пакет включены различные классы для разработки и управления bean-компонентами, многократно используемыми компонентами, определенными архитектурой JavaBeans . Архитектура предоставляет механизмы для управления свойствами компонентов и запуска событий при изменении этих свойств.
API-интерфейсы java.beans
предназначены для использования инструментом редактирования bean-компонентов, с помощью которого bean-компоненты можно комбинировать, настраивать и манипулировать ими. Одним из типов редактора компонентов является конструктор графического интерфейса в интегрированной среде разработки .
, или java.awt
Abstract Window Toolkit, обеспечивает доступ к базовому набору виджетов графического пользовательского интерфейса на основе набора виджетов базовой собственной платформы, ядра подсистемы событий графического пользовательского интерфейса и интерфейса между собственной оконной системой и приложением Java. Он также предоставляет несколько базовых менеджеров макетов , пакет передачи данных для использования с буфером обмена и перетаскиванием , интерфейс для устройств ввода, таких как мыши и клавиатуры , а также доступ к панели задач на поддерживающих системах. Этот пакет javax.swing
содержит наибольшее количество перечислений (всего 7) в JDK 6.
Пакет java.rmi
обеспечивает удаленный вызов методов Java для поддержки удаленных вызовов процедур между двумя Java-приложениями, работающими в разных JVM .
В пакет включена поддержка безопасности, включая алгоритм дайджеста сообщений java.security
.
Реализация JDBC API (используется для доступа к базам данных 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), поэтому виджеты в графическом интерфейсе могут имитировать те, которые используются в базовой собственной системе. Шаблоны проектирования пронизывают систему, особенно модификация шаблона модель-представление-контроллер , которая ослабляет связь между функцией и внешним видом. Одно несоответствие заключается в том, что (начиная с J2SE 1.3) шрифты рисуются базовой собственной системой, а не Java, что ограничивает переносимость текста. Существуют обходные пути, такие как использование растровых шрифтов. В общем, используются «макеты», которые сохраняют элементы в эстетически согласованном графическом интерфейсе на разных платформах.
Пакет 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]