Java SE
Java Platform, Standard Edition (Java SE) є обчислювальною платформою для розробки та розгортання портативного коду для десктопів і серверів.[1] Java SE раніше називалася платформою Java 2, стандартною версією (J2SE).
Платформа використовує мову програмування Java і є частиною сімейства платформ Java. Java SE визначає ряд API загального призначення — такі як Java API[en] для бібліотеки класів Java — і також включає специфікацію мови Java і специфікацію віртуальної машини Java.[2] Один з найбільш відомих реалізацій Java SE є Java Development Kit (JDK) корпорації Oracle.[3]
Платформа була відома як платформа Java 2, 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).[4] 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) є пов'язаною специфікацією, призначеною для забезпечення сертифікованої колекції Java API для розробки програмного забезпечення для невеликих, обмежених ресурсами пристроїв, таких як стільникові телефони, КПК і телеприставки.
Java Runtime Environment (JRE) та Java Development Kit (JDK) — це фактично завантажені та встановлені на комп'ютері файли для запуску або розробки програм Java відповідно.
Пакет Java java.lang
містить основні класи та інтерфейси, тісно пов'язані з мовою та середою виконання[en]. Це включає в себе кореневі класи, які утворюють ієрархію класів[en], типи, пов'язані з визначенням мови, основні винятки, математичні функції, потокові, функції безпеки, а також деяку інформацію про базову систему. Цей пакет містить 22 з 32 класів Error
наданих у JDK 6.
Основні класи та інтерфейси в java.lang
:
Object
— клас, який є коренем кожної ієрархії класів.Enum
— базовий клас для класів перерахування (як у J2SE 5.0).Class
— клас, що є коренем рефлексії Java.Throwable
— клас, який є базовим класом ієрархії класу виключення.Exception
іRuntimeException
— базові класи для кожного типу виключення.Thread
— клас, що дозволяє виконувати операції над потоками.String
— клас для рядків і рядкових літералів[en].StringBuffer
іStringBuilder
— класи для виконання маніпулювання рядками (StringBuilder
у J2SE 5.0).Comparable
— інтерфейс, що дозволяє узагальнювати порівняння та упорядкування об'єктів (як у J2SE 1.2).Iterable
— інтерфейс, що дозволяє загальну ітерацію з використанням покращеного for циклу (як у J2SE 5.0).ClassLoader
,Process
,Runtime
,SecurityManager
іSystem
— класи, які забезпечують «системні операції», які керують динамічним завантаженням[en] класів, створенням зовнішніх процесів, запитами хост-середовища, такими як час доби, і виконання політики безпеки[en] .Math
іStrictMath
— класи, які забезпечують основні математичні функції, такі як синус, косинус і квадратний корінь (StrictMath
як J2SE 1.3).- Класи обгортки примітивів[en] які інкапсулюють примітивні типи як об'єкти .
- Основні класи виключення, викинуті для рівня мови та інших загальних винятків.
Класи в java.lang
автоматично імпортуються в кожен вихідний файл .
Пакет java.lang.ref
надає більш гнучкі типи посилань, ніж інакше доступні, дозволяючи обмежену взаємодію між програмою та збирачем сміття Java Virtual Machine (JVM). Це важливий пакет, який є достатньо центральним для мови дизайнерів мови, щоб дати йому ім'я, яке починається з «java.lang», але це кілька спеціальних цілей і не використовується багатьма розробниками. Цей пакет був доданий в J2SE 1.2.
Java має виразну систему посилань і дозволяє особливу поведінку для збору сміття. Нормальна посилання на Java відома як «сильна посилання». Пакет java.lang.ref
визначає три інші типи посилань — м'які, слабкі[en] та фантомні посилання. Кожен тип посилання призначений для конкретного використання.
SoftReference
може використовуватися для реалізації кешу. Об'єкт, який не може бути досягнутий сильним посиланням (тобто не є сильно досяжним), але на нього посилається м'яка посилання, називається «м'яко досяжним». Тендітний об'єкт може бути сміттям, зібраним на розсуд збирача сміття. Це зазвичай означає, що м'якодоступні об'єкти є тільки сміттям, яке збирається, коли вільна пам'ять низька, але знову ж таки, це на розсуд збирача сміття. Семантично, м'яка посилання означає, «Зберегти цей об'єкт, коли ніщо інше не посилається на нього, якщо тільки пам'ять не потрібна».WeakReference
використовується для реалізації слабких карт. Об'єкт, який не є сильно або м'яко доступним, але на нього посилається слабка посилання, називається «слабодосяжна[en]». Слабкодоступний об'єкт — це сміття, зібране в наступному циклі збору. Така поведінка використовується в класіjava.util.WeakHashMap
. Слабка мапа дозволяє програмісту покласти пари ключ / значення у мапу і не турбуватися про об'єкти, що займають пам'ять, коли ключ більше не може бути досягнутий ніде. Іншим можливим застосуванням слабких посилань є пул інтернування рядків[en] . Семантично, слабка посилання означає «позбутися цього об'єкта, коли ніщо інше не посилається на нього при наступному збиранні».PhantomReference
використовується для посилання на об'єкти, які були позначені для збору сміття і були завершені, але ще не були відновлені. Об'єкт, який не є сильно, м'яко або слабкодоступним, але на нього посилається фантомне посилання, називається «phantom reachable». Це дає можливість більш гнучкого очищення, ніж це можливо тільки за допомогою механізму завершення. Семантично, фантомна посилання означає «цей об'єкт більше не потрібний і був завершений під час підготовки до збирання».
Кожен з цих типів посилань розширює клас Reference
, який забезпечує метод get()
для повернення сильного посилання на референтний об'єкт (або null
якщо посилання було очищено або якщо тип посилання — фантом), і метод clear()
, щоб очистити посилання.
java.lang.ref
також визначає клас ReferenceQueue
, який може використовуватися в кожній з описаних вище програм для відстеження об'єктів, які змінили тип посилання. Коли створюється Reference
, вона за бажанням зареєстрована з еталонною чергою. Програма опитує чергу посилань, щоб отримати посилання, які змінили стан досяжності.
Рефлексія є складовою частиною Java API, що дозволяє Java-коду вивчати і «відображати» компоненти Java під час виконання і використовувати відображені члени. Класи в пакеті java.lang.reflect разом з java.lang.
Class
і java.lang. Package розміщує програми, такі як налагоджувачи, інтерпретатори, інспектори об'єктів, браузери класів[en] і служби, такі як серіалізація об'єктів і JavaBeans, які потребують доступу до загальнодоступних членів цільового об'єкта (на основі його класу виконання) або членів, оголошених даним класом . Цей пакет було додано до JDK 1.1.
Рефлексія використовується для створення екземплярів класів і виклику методів, що використовують їх імена, концепція, яка дозволяє здійснювати динамічне програмування. Класи, інтерфейси, методи, поля та конструктори можуть бути відкриті та використані під час виконання. Відображення підтримується метаданими, які має JVM про програму.
Існують основні методи, які використовуються у рефлекії:
- Відкриття — це передбачає прийняття об'єкта або класу і виявлення членів, суперкласів, реалізованих інтерфейсів, а потім, можливо, використання знайдених елементів.
- Використовувати по імені — передбачає, починаючи з символічного імені елемента і використовуючи ім'я елемента.
Відкриття зазвичай починається з об'єкта і викликає метод Object.getClass()
щоб отримати Class
об'єкта. Об'єкт Class
має кілька методів для виявлення вмісту класу, наприклад:
getMethods()
— повертає масив об'єктів Method представляють всі загальнодоступні методи класу або інтерфейсуgetConstructors()
— повертає масив об'єктів Constructor представляють всі публічні конструктори класуgetFields()
— повертає масив об'єктівField
представляють усі загальні поля класу або інтерфейсуgetClasses()
— повертає масив об'єктівClass
представляють усі відкриті класи і інтерфейси, які є членами (наприклад, внутрішніми класами) класу або інтерфейсуgetSuperclass()
— повертає об'єктClass
представляє суперклас класу або інтерфейсу (для інтерфейсів повертаєтьсяnull
)getInterfaces()
— повертає масив об'єктівClass
представляють усі інтерфейси, які реалізовані класом або інтерфейсом
Об'єкт Class
може бути отриманий або за допомогою відкриття, використовуючи клас literal (наприклад 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
invoke(Object, Method, Object[])
InvocationHandler
invoke(Object, Method, Object[])
для кожного методу, викликаного об'єктом проксі — перший параметр є об'єктом proxy, другий параметр — об'єкт Method
представляє метод з інтерфейсу, реалізованого proxy, а третім параметром є масив параметрів, що передаються інтерфейсному методу. Метод invoke()
повертає результат Object
який містить результат, повернутий коду, який називається методом інтерфейсу proxy.
Пакет java.io містить класи, що підтримують введення та виведення даних . Класи в пакеті в першу чергу орієнтовані на потік; однак, клас для файлів випадкового доступу також надається. Центральними класами в пакеті є InputStream
і OutputStream
, які є абстрактними базовими класами для читання і запису в байтові потоки, відповідно. Пов'язані класи Reader і Writer є абстрактними базовими класами для читання і запису до символьних потоків, відповідно. Пакет також має декілька різних класів для підтримки взаємодії з файловою системою хоста.
Класи потоків слідують шаблону декоратора, розширюючи базовий підклас для додавання функцій до класів потоків. Підкласи класів базового потоку зазвичай називаються для одного з таких атрибутів:
- джерело / призначення потокових даних
- тип даних, записаних на / з потоку
- додаткову обробку або фільтрацію виконують на потокових даних
XxxStreamType
потоків називаються за допомогою шаблону іменування XxxStreamType
, де Xxx
— це назва, що описує функцію, а StreamType
— один з InputStream
, OutputStream
, Reader
або Writer
.
Наступна таблиця показує джерела / призначення, які підтримуються безпосередньо пакетом java.io
:
Джерело / призначення | Ім'я | Типи потоків | In out | Класи |
---|---|---|---|---|
масив byte (byte[] )
|
ByteArray
|
byte
|
in out | ByteArrayInputStream, ByteArrayOutputStream |
char масив (char[] )
|
CharArray
|
char
|
in out | CharArrayReader, CharArrayWriter |
файл | File
|
byte , char
|
in out | FileInputStream, FileOutputStream, FileReader, FileWriter |
рядок (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
.
Класи Reader
і Writer
— це просто байтові потоки з додатковою обробкою на потоці даних для перетворення байтів у символи. Вони використовують кодування символів за замовчуванням для платформи, яка в J2SE 5.0 представлена Charset
символів, повернутим java.nio.charset
. Charset.defaultCharset()
Клас InputStreamReader
перетворює InputStream
в Reader
а клас OutputStreamWriter перетворює OutputStream
в Writer
. Обидва ці класи мають конструктори, які підтримують визначення кодування символів для використання. Якщо не вказано кодування, програма використовує кодування за умовчанням для платформи.
Операція | Ім'я | Типи потоків | In out | Класи |
---|---|---|---|---|
буферизація | Buffered
|
byte , char
|
in out | BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter |
«відсунути» останнє значення читання | Pushback
|
byte , char
|
в | PushbackInputStream, PushbackReader |
читання / запис примітивних типів | Data
|
byte
|
in out | DataInputStream, DataOutputStream |
серіалізація об'єктів (об'єкти читання / запису) | Object
|
байт | in out | 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 пакет підтримує multiprecision арифметику (в тому числі модульних арифметичних операцій) і забезпечує multiprecision простого числа генераторів, що використовуються для криптографічного генерації ключів. Основними класами пакета є:
BigDecimal
— забезпечує довільну точність підписаних десяткових чисел.BigDecimal
надає користувачеві можливість керувати поведінкою округлення за допомогоюRoundingMode
.BigInteger
— забезпечує цілі числа довільної точності. Операції наBigInteger
не переповнюються або втрачають точність. На додаток до стандартних арифметичних операцій, він забезпечує модульну арифметику, розрахунок GCD, тестування простоти, генерацію простого числа, маніпуляцію бітами та інші різноманітні операції.MathContext
— інкапсулює параметри контексту, які описують певні правила для числових операторів.RoundingMode
— перерахування, що забезпечує вісім варіантів округлення.
Пакет java.net надає спеціальні процедури java.net виводу для мереж, що дозволяють HTTP- запити, а також інші спільні операції.
Пакет java.text впроваджує java.text розбору для рядків і підтримує різні мови, що читаються людиною, і синтаксичний аналіз.
Структури даних, які об'єднують об'єкти, є осередком пакета java.util
. До пакету входить API Collections, організована ієрархія структури даних, на яку сильно впливають міркування моделей проектування.
Створений для підтримки створення Java-аплетів, пакет java.applet дозволяє програмам завантажуватися через мережу і запускатися в java.applet пісочниці. Обмеження безпеки легко накладаються на пісочницю. Розробник, наприклад, може застосувати цифровий підпис до аплету, тим самим позначаючи його як безпечний. Це дозволяє користувачеві надавати дозвіл аплету на виконання обмежених операцій (наприклад, доступ до локальних жорстких дисків), а також видаляє деякі або всі обмеження пісочниці. Цифрові сертифікати видаються органами сертифікації.
У пакет java.beans
входять різні класи для розробки та маніпулювання компонентами, повторно використовувані компоненти, визначені архітектурою JavaBeans. Архітектура забезпечує механізми маніпулювання властивостями компонентів і подій стрільби, коли ці властивості змінюються.
API в java.beans
призначені для використання засобом редагування bean, в якому beans можна комбінувати, налаштовувати і маніпулювати. Один тип редактора bean — це дизайнер GUI в інтегрованому середовищі розробки.
Інструментарій 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 через IIOP. Цей протокол поєднує функції RMI і CORBA.
Основні технології Java SE — CORBA / RMI-IIOP [Архівовано 5 червня 2012 у Wayback Machine.]
Swing — це набір процедур, які побудовані на java.awt
щоб забезпечити незалежний від платформи набір інструментів. javax.swing
використовує підпрограми 2D, щоб відобразити компоненти інтерфейсу користувача замість того, щоб покладатися на базову підтримку графічного інтерфейсу операційної системи.
Цей пакет містить найбільшу кількість класів (всього 133) у JDK 6. Цей пакет разом з java.awt
також містить найбільшу кількість переліків (усього 7) у JDK 6. Він підтримує підключаються зовнішній вигляд і відчуває (PLAFs), так що віджети в графічному інтерфейсі можуть імітувати ті з базової системи. Моделі проектування пронизують систему, особливо модифікацію моделі модельного виду-контролера, яка розхитує зв'язок між функцією і зовнішнім виглядом. Одна з непослідовностей полягає в тому, що шрифти (починаючи з J2SE 1.3) малюються базовою системою, а не Java, обмежуючи переносимість тексту. Існують обхідні шляхи, наприклад, використання бітових шрифтів. Загалом, «макети» використовуються і зберігають елементи в межах естетично узгодженого графічного інтерфейсу на різних платформах.
Пакет javax.swing.text.html.parser
надає HTML-синтаксичний аналізатор, javax.swing.text.html.parser помилки, який використовується для написання різних веббраузерів і вебботів.
Пакет javax.xml.bind.annotation
містить найбільшу кількість типів анотацій (всього 30) у JDK 6. Він визначає анотації для налаштування елементів програми Java до відображення XML-схеми.
org.omg.
Пакет CORBA надає підтримку віддаленого зв'язку між додатками за допомогою протоколу General Inter-ORB і підтримує інші особливості спільної архітектури брокера запитів об'єктів. Те ж, що і RMI і RMI-IIOP, цей пакет призначений для виклику віддалених методів об'єктів на інших віртуальних машинах (зазвичай через мережу).
Цей пакет містить найбільшу кількість класів Exception
(всього 45) у JDK 6. З усіх можливостей спілкування CORBA переноситься між різними мовами; однак, з цим приходить більш складність.
org.omg. Пакет PortableInterceptor містить найбільшу кількість інтерфейсів (всього 39) в JDK 6. Вона забезпечує механізм реєстрації гаків ORB, через які послуги ORB перехоплюють нормальний потік виконання ORB.
Було повідомлено про декілька критичних уразливостей безпеки, найостанніші у січні 2013 року.[5][6] Оповіщення безпеки від Oracle оголошують про критичні для системи безпеки виправлення для Java SE.[7]
- ↑ Java SE Overview. Oracle Corporation. Архів оригіналу за 24 грудня 2014. Процитовано 26 лютого 2017.
- ↑ Java SE 6 Release Contents. Oracle Corporation and/or its affiliates. Архів оригіналу за 25 січня 2021. Процитовано 1 січня 2013.
- ↑ Java SE 7 Features and Enhancements. Oracle Corporation. Архів оригіналу за 7 травня 2019. Процитовано 4 травня 2016.
[...] JDK 7, Oracle's implementation of Java SE 7.
- ↑ Java Specification Requests Overview. Oracle Corporation and/or its affiliates. Архів оригіналу за 15 грудня 2012. Процитовано 1 січня 2013.
- ↑ Dangerous vulnerability in latest Java version [Архівовано 14 жовтня 2018 у Wayback Machine.] The H Security, Jan. 10, 2013
- ↑ Darlene Storm (25 вересня 2012). Another critical Java vulnerability puts 1 billion users at risk. Computerworld Security Blog. Архів оригіналу за січень 13, 2013. Процитовано травень 20, 2019.
- ↑ Critical Patch Updates, Security Alerts and Third Party Bulletin. Oracle. Архів оригіналу за 6 жовтня 2019. Процитовано 20 травня 2019.
- Java SE в Oracle Technology Network [Архівовано 24 грудня 2014 у Wayback Machine.]
- Навчання Java [Архівовано 18 травня 2019 у Wayback Machine.]
- Java SE 10 API Javadocs
- Документація Java SE API [Архівовано 8 серпня 2012 у Wayback Machine.]
- JSR 270 [Архівовано 25 січня 2021 у Wayback Machine.] (Java SE 6)
- 1.8
- 1.7
- 1.6