Платформа Java, Standard Edition (Java SE ) является вычислительной платформой для разработки и развертывания переносимого кода для настольных и серверных сред. Java SE ранее назывался Платформа Java 2, Standard Edition (J2SE ).
Платформа использует язык программирования Java и является частью семейства программных платформ Java. Java SE определяет ряд API общего назначения, таких как Java API для библиотеки классов Java, а также включает Спецификацию языка Java и Спецификация виртуальной машины Java. OpenJDK является официальной эталонной реализацией, начиная с версии 7.
Платформа была известна как 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). 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 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 reflection.Throwable
- класс, который является базовым классом иерархии классов исключений.Ошибка
, Exception
, а RuntimeException
- базовые классы для каждого типа исключения.Thread
- класс, разрешающий операции над потоками.String
- класс для строк и строковых литералов.StringBuffer
и StringBuilder
- классы для выполнения операций со строками (StringBuilder
начиная с J2SE 5.0).Comparable
- интерфейс, позволяющий общее сравнение и упорядочивание объектов (начиная с J2SE 1.2).Итерируемый
- интерфейс, позволяющий выполнять универсальную итерацию с использованием расширенного для
цикла (начиная с 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
, который можно использовать в каждом из рассмотренных выше приложений для отслеживания объектов, изменивших ссылочный тип. Когда создается Ссылка
, она необязательно регистрируется в очереди ссылок. Приложение опрашивает очередь ссылок, чтобы получить ссылки, которые изменили состояние доступности.
Reflection - это составная часть 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
, член Method
, Constructor
или Field
объекты могут быть получены с использованием символического имени члена. Например:
getMethod ("methodName", Class...)
- возвращает объект Method
, представляющий общедоступный метод с именем "methodName" класса или интерфейса, который принимает параметры, указанные в Class...
parameters.getConstructor(Class...)
- возвращает объект Constructor
, представляющий открытый конструктор класс, который принимает параметры, указанные в Class...
parameters.getField("fieldName")
- возвращает объект Field
, представляющий общедоступный поле с именем «fieldName» класса или интерфейса. ОбъектыMethod
, Constructor
и Field
могут использоваться для динамического доступа к представленному члену класса. Например:
Field.get(Object)
- возвращает Object
, содержащий значение поля из экземпляра объекта, переданного в get ()
. (Если объект Поле
представляет статическое поле, то параметр Object
игнорируется и может иметь значение null
.)Method.invoke (Object, Object...)
- возвращает Object
, содержащий результат вызова метода для экземпляра первого параметра Object
, переданного в invoke ()
. Остальные Object...
параметры передаются методу. (Если объект Method
представляет статический метод , то первый параметр Object
игнорируется. и может иметь значение null
.)Constructor.newInstance(Object...)
- возвращает новый экземпляр Object
после вызова конструктора. Object...
параметры передаются конструктору. (Обратите внимание, что конструктор без параметров для класса также может быть вызван путем вызова newInstance ()
.)Пакет java.lang.reflect
также предоставляет класс Array
, который содержит статические методы для создания массива и управления им. bjects, а начиная с J2SE 1.3, класс Proxy
, который поддерживает динамическое создание прокси-классов, реализующих указанные интерфейсы.
Реализация класса Proxy
обеспечивается предоставленным объектом, который реализует интерфейс InvocationHandler
. Метод InvocationHandler
invoke (Object, Method, Object)
вызывается для каждого метода, вызываемого для прокси-объекта - первый параметр - это прокси-объект, второй параметр - это объект Method
, представляющий метод из интерфейса, реализованного прокси, а третий параметр - это массив параметров, переданных в метод интерфейса. Метод invoke ()
возвращает результат Object
, который содержит результат, возвращенный коду, который вызвал метод интерфейса прокси.
Пакет java.io
содержит классы, которые поддерживают ввод и вывод. Классы в пакете в основном ориентированы на поток ; однако также предоставляется класс для файлов с произвольным доступом . Центральными классами в пакете являются InputStream
и OutputStream
, которые являются абстрактными базовыми классами для чтения из и запись в байтовые потоки соответственно. Связанные классы Reader
и Writer
являются абстрактными базовыми классами для чтения и записи в потоки символов соответственно.. В пакете также есть несколько разных классов для поддержки взаимодействия с хостом файловой системой.
Классы потоков следуют шаблону декоратора , расширяя базовый подкласс для добавления функций к классам потока. Подклассы базовых классов потока обычно именуются по одному из следующих атрибутов:
Подклассы потока именуются с использованием именования pattern XxxStreamType
, где Xxx
- это имя, описывающее функцию, а StreamType
может быть одним из InputStream
, OutputStream
, Reader
или Writer
.
В следующей таблице показаны поддерживаемые источники / места назначения. непосредственно пакетом java.io
:
Source/Destination | Name | Типы потоков | In / Out | Классы |
---|---|---|---|---|
байт массив (байт ) | ByteArray | байт | вход, выход | ByteArrayInputStream , ByteArrayOutputStream |
char массив (char ) | CharArray | char | in, out | CharArrayReader , CharArrayWriter |
file | File | byte , char | in, out | FileInputStream , FileOutputStream , FileReader , FileWriter |
string (StringBuffer ) | String | char | in, out | StringReader , StringWriter |
поток (Thread ) | Piped | byte , char | in, out | PipedInputStream , PipedOutputStream , PipedReader , PipedWriter |
Другие стандартные пакеты библиотек предоставляют реализации потоков для других мест назначения, таких как InputStream
, возвращаемый методом java.net.Socket.getInputStream()
или Java EE javax.servlet.ServletOutputStream
класс.
Обработка типов данных и обработка или фильтрация потоковых данных выполняется с помощью потоковых фильтров. Все классы фильтров принимают другой совместимый объект потока в качестве параметра конструктора и украшают вложенный поток дополнительными функциями. Фильтры создаются путем расширения одного из базовых классов фильтров FilterInputStream
, FilterOutputStream
, FilterReader
или FilterWriter
.
The Reader
и Writer
классы на самом деле представляют собой просто потоки байтов с дополнительной обработкой, выполняемой в потоке данных для преобразования байтов в символы. Они используют кодировку символов по умолчанию для платформы, которая с J2SE 5.0 представлена Charset
, возвращаемым java.nio.charset.Charset.defaultCharset ()
статический метод. Класс InputStreamReader
преобразует InputStream
в Reader
, а класс OutputStreamWriter
преобразует OutputStream
в Writer
. Оба эти класса имеют конструкторы, которые поддерживают указание используемой кодировки символов. Если кодировка не указана, программа использует кодировку по умолчанию для платформы.
В следующей таблице показаны другие процессы и фильтры, которые пакет java.io
напрямую поддерживает. Все эти классы расширяют соответствующий класс Filter
.
Операция | Имя | Типы потоков | Вход / Выход | Классы |
---|---|---|---|---|
буферизация | Буферизация | байт , char | in, out | BufferedInputStream , BufferedOutputStream , BufferedReader , BufferedWriter |
"вернуть" последнее значение, прочитанное | Возврат | байт , char | в | PushbackInputStream , PushbackReader |
чтение / запись примитивные типы | Данные | байт | вход, выход | DataInputStream , DataOutputStream |
сериализация объекта (объекты чтения / записи) | Объект | байт | вход, выход | ObjectInputStream , ObjectOutputStream |
Класс 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
- предоставляет целые числа произвольной точности. Операции с BigInteger
не переполняют и не теряют точности. В дополнение к стандартным арифметическим операциям он обеспечивает модульную арифметику, вычисление GCD, проверку простоты, генерацию простых чисел, бит манипуляции и другие разные операции.MathContext
- инкапсулируют настройки контекста, описывающие определенные правила для числовых операторов.RoundingMode
- перечисление, обеспечивающее округление до восьми поведения.Пакет java.net
предоставляет специальные процедуры ввода-вывода для сетей, позволяя также запросы HTTP как и другие общие транзакции.
Пакет java.text
реализует процедуры синтаксического анализа строк и поддерживает различные удобочитаемые языки и синтаксический анализ, зависящий от локали.
Структуры данных, которые объединяют объекты, находятся в центре внимания пакета java.util
. В пакет включен Collections API, иерархия организованной структуры данных, на которую в значительной степени повлияли соображения шаблонов проектирования.
Созданы для поддержки создания Java-апплета, java.applet Пакет
позволяет загружать приложения по сети и запускать их в защищенной песочнице. Ограничения безопасности легко накладываются на песочницу. Разработчик, например, может применить цифровую подпись к апплету, тем самым пометив его как безопасный. Это позволяет пользователю предоставить апплету разрешение на выполнение ограниченных операций (таких как доступ к локальному жесткому диску) и снимает некоторые или все ограничения песочницы. Цифровые сертификаты выдаются центрами сертификации.
В пакет java.beans
включены различные классы для разработки и управления компонентами, повторно используемые компоненты, определенные архитектурой JavaBeans. Архитектура предоставляет механизмы для управления свойствами компонентов и запуска событий при изменении этих свойств.
API-интерфейсы в java.beans
предназначены для использования с помощью инструмента редактирования bean-компонентов, в котором bean-компоненты можно комбинировать, настраивать и управлять ими. Один из типов редакторов компонентов - это GUI дизайнер в интегрированной среде разработки.
java.awt
, или Abstract Window Toolkit, обеспечивает доступ к базовому набору виджетов GUI на основе набора виджетов базовой собственной платформы, ядра подсистемы событий GUI и интерфейса между собственной оконной системой и Java. применение. Он также предоставляет несколько основных менеджеров компоновки, пакет передачи данных для использования с буфером обмена и перетаскиванием, интерфейсом для устройств ввода такие как мыши и клавиатуры, а также доступ к панели задач на вспомогательных системах. Этот пакет вместе с javax.swing
содержит наибольшее количество перечислений (всего 7) в JDK 6.
Пакет java.rmi
предоставляет вызов удаленного метода Java для поддержки вызовов удаленных процедур между двумя приложениями Java, работающими в разных JVM.
Поддержка безопасности, включая алгоритм дайджеста сообщения, включена в пакет java.security
.
Реализация JDBC API (используется для доступа к SQL базам данных ) сгруппирована в java.sql
пакет.
Пакет javax.rmi
обеспечивает поддержку удаленной связи между приложениями с использованием протокола RMI через 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 в all) в JDK 6. Он определяет аннотации для настройки элементов программы Java на отображение схемы XML.
Пакет org.omg.CORBA
обеспечивает поддержку удаленного связь между приложениями с использованием General Inter-ORB Protocol и поддержка других функций архитектуры брокера запросов общих объектов. Подобно RMI и RMI-IIOP, этот пакет предназначен для вызова удаленных методов объектов на других виртуальных машинах (обычно через сеть).
Этот пакет содержит наибольшее количество классов Exception
(всего 45) в JDK 6. Из всех возможностей связи CORBA переносима между различными языками; однако с этим возникает большая сложность.
Эти пакеты устарели в Java 9 и были удалены из Java 11.
org.omg.PortableInterceptor
пакет содержит наибольшее количество интерфейсов (всего 39) в JDK 6. Он предоставляет механизм для регистрации перехватчиков ORB, через которые службы ORB перехватывают нормальный поток выполнения ORB.
Сообщалось о нескольких критических уязвимостях системы безопасности, последняя из которых - в январе 2013 года. В предупреждениях безопасности от Oracle объявляются критические исправления, связанные с безопасностью, для Java SE.