Java SE: відмінності між версіями

[неперевірена версія][неперевірена версія]
Вилучено вміст Додано вміст
Створено шляхом перекладу сторінки «Java Platform, Standard Edition»
 
Створено шляхом перекладу сторінки «Java Platform, Standard Edition»
Рядок 30:
* <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/Comparable.html Comparable]</code> - інтерфейс, що дозволяє узагальнювати порівняння та упорядкування об'єктів (як у J2SE 1.2).
* <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/Iterable.html Iterable]</code> - інтерфейс, що дозволяє загальну ітерацію з використанням {{Не перекладено|Foreach цикл|покращенного for циклу|en|Foreach loop}} (як у J2SE 5.0).
* <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/ClassLoader.html ClassLoader]</code>, <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/Process.html Process]</code>, <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/Runtime.html Runtime]</code>, <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/SecurityManager.html SecurityManager]</code> і <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/System.html System]</code> - класи, які забезпечують "системні операції", які керують {{Не перекладено|Динамічне завантаження|динамічним завантаженням|en|Dynamic loading}} класів, створенням зовнішніх [[Процес (інформатика)|процесів]], запитами хост-середовища, такими як час доби, і виконання {{Не перекладено|Політика безпеки|політики безпеки|en|Security policy}} .
* <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/Math.html Math]</code> і <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/StrictMath.html StrictMath]</code> - класи, які забезпечують основні математичні функції, такі як [[синус]], [[Тригонометричні функції|косинус]] і [[квадратний корінь]] ( <code>StrictMath</code> як J2SE 1.3).
* {{Не перекладено|Класи примітивуобгортки примітивів|Класи обгортки, примітивів|en|Primitive wrapper class}} які [[Інкапсуляція (програмування)|інкапсулюють]] {{Не перекладено|Примітивні типи|примітивні типи|en|Primitive data type}} як [[Об'єкт (програмування)|об'єкти]] .
* Основні класи виключення, викинуті для рівня мови та інших загальних винятків.
 
Класи в <code>java.lang</code> автоматично імпортуються в кожен [[Початковий код|вихідний файл]] .
 
==== java.lang.ref ====
Пакет <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/ref/package-summary.html java.lang.ref]</code> надає більш гнучкі типи [[Посилання (програмування)|посилань,]] ніж інакше доступні, дозволяючи обмежену взаємодію між програмою та [[Збирання сміття|збирачем сміття]] [[Віртуальна машина Java|Java Virtual Machine]] (JVM). Це важливий пакет, який є достатньо центральним для мови дизайнерів мови, щоб дати йому ім'я, яке починається з "java.lang", але це кілька спеціальних цілей і не використовується багатьма розробниками. Цей пакет був доданий в J2SE 1.2.
 
Java має виразну систему посилань і дозволяє особливу поведінку для збору сміття. Нормальна посилання на Java відома як "сильна посилання". Пакет <code>java.lang.ref</code> визначає три інші типи посилань - м'які, {{Не перекладено|Слабкі посилання|слабкі|en|Weak reference}} та фантомні посилання. Кожен тип посилання призначений для конкретного використання.
 
* <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/ref/SoftReference.html SoftReference]</code> може використовуватися для реалізації [[Кеш|кешу]]. Об'єкт, який не може бути досягнутий сильним посиланням (тобто не є сильно досяжним), але на нього посилається м'яка посилання, називається "м'яко досяжним". Тендітний об'єкт може бути сміттям, зібраним на розсуд збирача сміття. Це зазвичай означає, що м'якодоступні об'єкти є тільки сміттям, яке збирається, коли вільна пам'ять низька, але знову ж таки, це на розсуд збирача сміття. Семантично, м'яка посилання означає, "Зберегти цей об'єкт, коли ніщо інше не посилається на нього, якщо тільки пам'ять не потрібна".
* <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/ref/WeakReference.html WeakReference]</code> використовується для реалізації слабких карт. Об'єкт, який не є сильно або м'яко доступним, але на нього посилається слабка посилання, називається "{{Не перекладено|Недосяжна пам'ять|слабодосяжна|en|Unreachable memory}}". Слабкодоступний об'єкт - це сміття, зібране в наступному циклі збору. Така поведінка використовується в класі [https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/WeakHashMap.html <code>java.util.WeakHashMap</code>]. Cлабка мапа дозволяє програмісту покласти пари ключ / значення у мапу і не турбуватися про об'єкти, що займають пам'ять, коли ключ більше не може бути досягнутий ніде. Іншим можливим застосуванням слабких посилань є {{Не перекладено|Інтернування рядків|пул інтернування рядків|en|String interning}} . Семантично, слабка посилання означає "позбутися цього об'єкта, коли ніщо інше не посилається на нього при наступному збиранні".
* <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/ref/PhantomReference.html PhantomReference]</code> використовується для посилання на об'єкти, які були позначені для збору сміття і були [[Фіналізатор|завершені]], але ще не були відновлені. Об'єкт, який не є сильно, м'яко або слабкодоступним, але на нього посилається фантомне посилання, називається "phantom reachable". Це дає можливість більш гнучкого очищення, ніж це можливо тільки за допомогою механізму завершення. Семантично, фантомна посилання означає "цей об'єкт більше не потрібний і був завершений під час підготовки до збирання".
 
Кожен з цих типів посилань розширює клас <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/ref/Reference.html Reference]</code>, який забезпечує [[Метод (програмування)|метод]] <code>get()</code> для повернення сильного посилання на референтний об'єкт (або <code>null</code> якщо посилання було очищено або якщо тип посилання - фантом), і метод <code>clear()</code>, щоб очистити посилання.
 
<code>java.lang.ref</code> також визначає клас <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/ref/ReferenceQueue.html ReferenceQueue]</code>, який може використовуватися в кожній з описаних вище програм для відстеження об'єктів, які змінили тип посилання. Коли створюється <code>Reference</code>, вона за бажанням зареєстрована з еталонною чергою. Програма опитує чергу посилань, щоб отримати посилання, які змінили стан досяжності.
 
==== java.lang.reflect ====
[[Рефлексія (програмування)|Рефлексія]] є складовою частиною [[Java]] API, що дозволяє Java-коду вивчати і "відображати" компоненти Java під час виконання і використовувати відображені члени. Класи в пакеті java.lang.reflect разом з <code>java.lang.</code> <code>Class</code> і java.lang. Package розміщує програми, такі як [[Налагоджувач|отладчики]], [[Інтерпретатор|інтерпретатори]], інспектори об'єктів, {{Не перекладено|Браузери класів|браузери класів|en|Class browser}} і служби, такі як [[серіалізація]] об'єктів і [[JavaBeans|JavaBeans,]] які потребують доступу до загальнодоступних членів цільового об'єкта (на основі його класу виконання) або членів, оголошених даним класом . Цей пакет було додано до JDK 1.1.
 
Рефлексія використовується для створення екземплярів класів і виклику методів, що використовують їх імена, концепція, яка дозволяє здійснювати динамічне програмування. Класи, інтерфейси, методи, [[Поле класу|поля]] та [[Конструктор (програмування)|конструктори]] можуть бути відкриті та використані під час виконання. Відображення підтримується [[Метадані|метаданими,]] які має JVM про програму.
 
===== Методи =====
Існують основні методи, які використовуються у рефлекії:
 
* Відкриття - це передбачає прийняття об'єкта або класу і виявлення членів, суперкласів, реалізованих інтерфейсів, а потім, можливо, використання знайдених елементів.
* Використовувати по імені - передбачає, починаючи з символічного імені елемента і використовуючи ім'я елемента.
 
====== Відкриття ======
Відкриття зазвичай починається з об'єкта і викликає метод <code>Object.getClass()</code> щоб отримати <code>Class</code> об'єкта. Об'єкт <code>Class</code> має кілька методів для виявлення вмісту класу, наприклад:
 
* getMethods() - повертає масив об'єктів Method представляють всі загальнодоступні методи класу або інтерфейсу
* <code>getConstructors()</code> - повертає масив об'єктів Constructor представляють всі публічні конструктори класу
* <code>getFields()</code> - повертає масив об'єктів <code>[https://docs.oracle.com/en/java/javase/12/docs/api/jdk.jdi/com/sun/jdi/Field.html Field]</code> представляють усі загальні поля класу або інтерфейсу
* <code>getClasses()</code> - повертає масив об'єктів <code>Class</code> представляють усі відкриті класи і інтерфейси, які є членами (наприклад, [[Внутрішній клас|внутрішніми класами]] ) класу або інтерфейсу
* <code>getSuperclass()</code> - повертає об'єкт <code>Class</code> представляє суперклас класу або інтерфейсу (для інтерфейсів повертається <code>null</code> )
* <code>getInterfaces()</code> - повертає масив об'єктів <code>Class</code> представляють усі інтерфейси, які реалізовані класом або інтерфейсом
 
====== Використовуйте по імені ======
Об'єкт <code>Class</code> може бути отриманий або за допомогою відкриття, використовуючи ''клас literal'' (наприклад <code>MyClass.class</code> ) або за допомогою імені класу (наприклад <code>Class.forName("mypackage. MyClass")</code>). З об'єктом <code>Class</code> можна отримати елемент <code>Method</code>, <code>Constructor</code> або <code>Field</code> використовуючи символічне ім'я члена. Наприклад:
 
* <code>getMethod("methodName", Class...)</code> - повертає об'єкт <code>Method</code> представляє відкритий метод, з назвою "methodName" класу або інтерфейсу, який приймає параметри, задані параметрами <code>Class...</code>
* <code>getConstructor(Class...)</code> - повертає об'єкт <code>Constructor</code> представляє публічний конструктор класу, який приймає параметри, задані параметрами <code>Class...</code>
* <code>getField("fieldName")</code> - повертає об'єкт <code>Field</code> представляє публічне поле з ім'ям "fieldName" класу або інтерфейсу.
 
Об'єкти <code>Method</code>, <code>Constructor</code> і <code>Field</code> можуть використовуватися для динамічного доступу до представленого члена класу. Наприклад:
 
* <code>Field.get(Object)</code> - повертає <code>Object</code> що містить значення поля з екземпляра об'єкта, переданого <code>get()</code> . (Якщо об'єкт <code>Field</code> представляє статичне поле, то параметр <code>Object</code> ігнорується і може бути <code>null</code> . )
* Method.invoke(Object, Object...) - повертає <code>Object</code> що містить результат виклику методу для екземпляра першого параметра <code>Object</code> переданого для <code>invoke()</code> . Інші параметри <code>Object...</code> передаються методу. (Якщо об'єкт <code>Method</code> представляє [[Метод (програмування)|статичний метод,]] то перший параметр <code>Object</code> ігнорується і може бути <code>null</code> . )
* Constructor.newInstance(Object...) - повертає новий екземпляр <code>Object</code> з виклику конструктора. Параметри <code>Object...</code> передаються конструктору. (Зауважте, що конструктор без параметрів класу може також викликатися за допомогою виклику newInstance() . )
 
Пакет <code>java.lang.reflect</code> також надає клас <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/reflect/Array.html Array]</code> який містить статичні методи для створення та маніпулювання об'єктами масиву, а також J2SE 1.3 - клас <code>[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/reflect/Proxy.html Proxy]</code> який підтримує динамічне створення класів проксі, які реалізують вказані інтерфейси.
 
Реалізація класу <code>Proxy</code> забезпечується об'єктом, що постачається, який реалізує інтерфейс InvocationHandler . <code>InvocationHandler</code> <code>invoke(Object, Method, Object [ ] )</code> <code>InvocationHandler</code> <code>invoke(Object, Method, Object[])</code> для кожного методу, викликаного об'єктом проксі - перший параметр є об'єктом proxy, другий параметр - об'єкт <code>Method</code> представляє метод з інтерфейсу, реалізованого proxy, а третім параметром є масив параметрів, що передаються інтерфейсному методу. Метод <code>invoke()</code> повертає результат <code>Object</code> який містить результат, повернутий коду, який називається методом інтерфейсу proxy.
 
== зовнішні посилання ==
{{Портал|Java (programming language)}}
 
* [https://www.oracle.com/technetwork/java/javase/overview/index.html Java SE в Oracle Technology Network]
* [http://wisentechnologies.com/it-courses/java-training.aspx Навчання Java]
* Java SE 10 API Javadocs
* [https://java.sun.com/reference/api/index.html Документація Java SE API]
* [https://www.jcp.org/en/jsr/detail?id=270 JSR 270] (Java SE 6)
* [https://web.archive.org/web/20140829134921/https://jdk8.java.net/ 1.8]
* [https://web.archive.org/web/20140903094835/https://jdk7.java.net/ 1.7]
* [https://web.archive.org/web/20140903094835/https://jdk6.java.net/ 1.6]
<nowiki>
[[Категорія:Програмні платформи]]