Об авторе .....................................................................................................................13
О техническом рецензенте .......................................................................................13
Благодарности.............................................................................................................14
Предисловие................................................................................................................15
Как появилась эта книга......................................................................................................................15
Об организации книги .........................................................................................................................16
Предполагаемая аудитория...............................................................................................................16
Исходный код и ошибки .....................................................................................................................16
Вопросы и замечания...........................................................................................................................16
Глава 1. Введение........................................................................................................ 17
Введение в JDK 9.................................................................................................................................... 17
Как читать эту книгу..............................................................................................................................18
Требования к системе ..........................................................................................................................20
Установка NetBeans IDE ......................................................................................................................21
Скачивание исходного кода..............................................................................................................21
Глава 2. Система модулей..........................................................................................23
Жизнь до Java 9.......................................................................................................................................23
Новая система модулей.......................................................................................................................25
Что такое модуль?..................................................................................................................................26
Зависимости модулей .......................................................................................................................... 27
Граф модулей.......................................................................................................................................... 29
Модули-агрегаторы...............................................................................................................................33
Объявление модулей............................................................................................................................34
Имена модулей...................................................................................................................................... 35
Контроль доступа к модулям............................................................................................................ 35
Объявление зависимости ...................................................................................................................37
Конфигурирование служб ..................................................................................................................37
Дескрипторы модулей .........................................................................................................................38
Компиляция объявлений модулей................................................................................................. 38
Версия модуля........................................................................................................................................ 38
Структура исходных файлов модуля............................................................................................. 39
Упаковка модулей..................................................................................................................................40
Хранение модуля в каталоге............................................................................................................ 40
Хранение модуля в модульном JAR-файле ................................................................................ 40
Хранение модуля в JMOD-файле.................................................................................................... 41
Путь к модулям........................................................................................................................................41
Видимые модули....................................................................................................................................43
Резюме........................................................................................................................................................45
Глава 3. Создаем свой первый модуль.................................................................... 47
Работа с инструментами командной строки............................................................................... 47
Оглавление  7
Подготовка каталогов...........................................................................................................................47
Написание исходного кода............................................................................................................... 48
Компиляция исходного кода............................................................................................................ 49
Упаковка кода модуля......................................................................................................................... 51
Выполнение программы.................................................................................................................... 52
Работа с NetBeans IDE..........................................................................................................................54
Настройка IDE......................................................................................................................................... 54
Создание проекта Java........................................................................................................................ 58
Задание свойств проекта................................................................................................................... 60
Добавление объявления модуля .................................................................................................... 62
Просмотр графа модуля..................................................................................................................... 64
Написание исходного кода............................................................................................................... 64
Компиляция исходного кода............................................................................................................ 65
Упаковка кода модуля......................................................................................................................... 66
Выполнение программы.....................................................................................................................67
Резюме........................................................................................................................................................69
Глава 4. Зависимости модулей .................................................................................70
Объявление зависимостей модуля .................................................................................................70
Исправление возможных ошибок...................................................................................................78
Пустой пакет............................................................................................................................................ 78
Модуль не найден................................................................................................................................. 78
Пакет не существует............................................................................................................................. 78
Исключение при разрешении модуля ......................................................................................... 79
Неявное чтение.......................................................................................................................................79
Квалифицированный экспорт...........................................................................................................83
Факультативная зависимость............................................................................................................85
Доступ к модулям с помощью рефлексии...................................................................................86
Раскрытые модули.................................................................................................................................87
Раскрытие пакетов ................................................................................................................................87
Использование глубокой рефлексии............................................................................................ 88
Доступность типов .................................................................................................................................96
Расщепление пакетов между несколькими модулями........................................................... 97
Ограничения в объявлениях модулей...........................................................................................98
Типы модулей ..........................................................................................................................................98
Нормальные модули............................................................................................................................ 99
Раскрытые модули................................................................................................................................ 99
Автоматические модули...................................................................................................................100
Безымянные модули..........................................................................................................................103
Порядок перехода на JDK 9............................................................................................................ 110
Дизассемблирование определения модуля ............................................................................ 111
Резюме..................................................................................................................................................... 115
Глава 5. Реализация служб ......................................................................................117
Что такое служба?................................................................................................................................117
Обнаружение служб........................................................................................................................... 119
Предоставление реализаций службы......................................................................................... 120
Определение интерфейса службы............................................................................................... 122
Определение поставщиков службы ............................................................................................ 125
8  Оглавление
Определение обычного поставщика службы простых чисел ...........................................125
Определение быстрого поставщика службы простых чисел............................................127
Определение самого быстрого поставщика службы простых чисел.............................129
Тестирование службы простых чисел......................................................................................... 130
Выборка и фильтрация поставщиков ......................................................................................... 134
Тестирование службы простых чисел по-старому................................................................. 135
Резюме......................................................................................................................................................137
Глава 6. Упаковка модуля ........................................................................................139
Формат JAR ............................................................................................................................................ 139
Что такое многоверсионный JAR-файл? ....................................................................................140
Создание многоверсионных JAR-файлов..................................................................................142
Правила для многоверсионных JAR-файлов ...........................................................................148
Многоверсионные JAR-файлы и базовый загрузчик............................................................150
Одинаковые файлы для разных версий JDK ...........................................................................150
Многоверсионные JAR-файлы и URL со схемой JAR ............................................................ 150
Атрибут Multi-Release в манифесте............................................................................................. 151
Формат JMOD........................................................................................................................................ 151
Программа jmod..................................................................................................................................151
Создание JMOD-файлов ...................................................................................................................153
Извлечение содержимого JMOD-файла ....................................................................................154
Печать содержимого JMOD-файла...............................................................................................154
Описание JMOD-файла .....................................................................................................................155
Запись хэшей модулей .....................................................................................................................155
Резюме..................................................................................................................................................... 158
Глава 7. Создание пользовательских образов среды выполненияя ................159
Что такое пользовательский образ среды выполнения?.................................................... 159
Создание пользовательского образа среды выполнения.................................................. 160
Связывание служб .............................................................................................................................. 164
Плагины команды jlink .....................................................................................................................166
Команда jimage.................................................................................................................................... 169
Резюме..................................................................................................................................................... 171
Глава 8. Несовместимые изменения в JDK 9........................................................172
Новая схема нумерации версий JDK........................................................................................... 172
Номер версии.......................................................................................................................................173
Признак предварительной версии ..............................................................................................174
Информация о сборке ......................................................................................................................174
Дополнительная информация .......................................................................................................174
Разбор старой и новой строки версии.......................................................................................175
Изменение значений системных свойств.................................................................................175
Использование класса Runtime.Version.....................................................................................175
Изменения в JDK и JRE...................................................................................................................... 179
Структурные изменения JDK и JRE...............................................................................................179
Изменения поведения ......................................................................................................................181
Изменения в загрузчиках классов...............................................................................................182
Доступ к ресурсам .............................................................................................................................. 186
Доступ к ресурсам до JDK 9............................................................................................................186
Оглавление  9
Доступ к ресурсам JDK 9..................................................................................................................191
Внутренние API JDK............................................................................................................................ 204
Замена модуля ..................................................................................................................................... 206
Резюме..................................................................................................................................................... 208
Глава 9. Нарушение инкапсуляции модуля ..........................................................210
Что такое нарушение инкапсуляции модуля?......................................................................... 210
Параметры командной строки ...................................................................................................... 211
Параметр --add-exports....................................................................................................................211
Параметр --add-opens.......................................................................................................................212
Параметр --add-reads ........................................................................................................................212
Параметр --permit-illegal-access ..................................................................................................213
Пример.................................................................................................................................................... 214
Атрибуты манифеста JAR-файла ................................................................................................... 220
Резюме..................................................................................................................................................... 223
Глава 10. API модулей ..............................................................................................225
Что такое API модулей? .................................................................................................................... 225
Представление модулей ...................................................................................................................227
Описание модулей ..............................................................................................................................227
Представление предложений модуля........................................................................................228
Представление версии модуля .....................................................................................................230
Другие свойства модулей................................................................................................................231
Базовая информация о модуле.....................................................................................................232
Запросы к модулям............................................................................................................................ 235
Модификация модулей......................................................................................................................237
Доступ к ресурсам модуля .............................................................................................................. 241
Аннотации модулей............................................................................................................................ 241
Загрузка классов ................................................................................................................................. 243
Слои модулей........................................................................................................................................ 246
Поиск модулей.....................................................................................................................................248
Чтение содержимого модуля .........................................................................................................250
Создание конфигураций ..................................................................................................................252
Создание слоя модулей....................................................................................................................254
Резюме..................................................................................................................................................... 262
Глава 11. Оболочка Java...........................................................................................264
Что такое оболочка Java?................................................................................................................. 264
Архитектура JShell.............................................................................................................................. 266
Запуск команды JShell .......................................................................................................................267
Выход из JShell..................................................................................................................................... 269
Что такое фрагменты и команды?................................................................................................ 270
Вычисление выражений................................................................................................................... 271
Вывод списка фрагментов............................................................................................................... 273
Редактирование фрагментов ..........................................................................................................277
Повторное выполнение предыдущих фрагментов............................................................... 280
Объявление переменных................................................................................................................. 280
Предложения import.......................................................................................................................... 283
Объявление методов ..........................................................................................................................287
10  Оглавление
Объявление типов............................................................................................................................... 288
Установка среды выполнения........................................................................................................ 292
Отсутствие контролируемых исключений ................................................................................ 293
Автозавершение.................................................................................................................................. 294
История фрагментов и команд.......................................................................................................297
Чтение трассы стека в JShell .......................................................................................................... 298
Повторное использование сеансов JShell................................................................................ 299
Сброс состояния JShell...................................................................................................................... 301
Перезагрузка состояния JShell...................................................................................................... 302
Конфигурирование JShell................................................................................................................ 305
Задание редактора фрагментов ...................................................................................................305
Задание режима выдачи..................................................................................................................306
Создание пользовательских режимов выдачи .......................................................................308
Задание стартовых фрагментов....................................................................................................313
Использование документации по JShell ................................................................................... 316
JShell API................................................................................................................................................. 318
Создание объекта JShell...................................................................................................................319
Работа с фрагментами ......................................................................................................................320
Обработка событий фрагмента.....................................................................................................322
Пример....................................................................................................................................................322
Резюме......................................................................................................................................................327
Глава 12. Изменения API процессов ......................................................................328
Что такое API процессов? ................................................................................................................ 328
Текущий процесс ................................................................................................................................. 329
Опрос состояния процесса.............................................................................................................. 330
Сравнение процессов........................................................................................................................ 334
Создание процесса............................................................................................................................. 334
Получение описателя процесса.................................................................................................... 342
Завершение процесса....................................................................................................................... 345
Управление правами процесса ..................................................................................................... 345
Резюме..................................................................................................................................................... 348
Глава 13. Изменения API коллекций......................................................................350
Общие сведения.................................................................................................................................. 350
Немодифицируемые списки........................................................................................................... 353
Немодифицируемые множества................................................................................................... 356
Немодифицируемые отображения.............................................................................................. 360
Резюме..................................................................................................................................................... 364
Глава 14. Клиентский API HTTP/2 ..........................................................................365
Что такое клиентский API HTTP/2?.............................................................................................. 366
Настройка среды для примеров................................................................................................... 368
Создание HTTP-клиентов................................................................................................................ 369
Обработка HTTP-запросов.............................................................................................................. 370
Получение построителя HTTP-запроса .....................................................................................371
Задание параметров HTTP-запроса ...........................................................................................371
Задание политики перенаправления запроса........................................................................ 381
Использование протокола WebSocket........................................................................................ 382
Оглавление  11
Создание серверной оконечной точки......................................................................................382
Создание клиентской оконечной точки.....................................................................................385
Выполнение программы..................................................................................................................389
Устранение неполадок в приложении WebSocket................................................................. 393
Резюме..................................................................................................................................................... 394
Глава 15. Модифицированный тип Deprecated ...................................................395
Что такое нерекомендуемый API?................................................................................................ 395
Как объявить API нерекомендуемым.......................................................................................... 395
Модификация аннотации @Deprecated в JDK 9....................................................................397
Подавление предупреждений о нерекомендованности.................................................... 399
Пример нерекомендуемого API.................................................................................................... 400
Статический анализ нерекомендуемых API............................................................................. 405
Динамический анализ нерекомендуемых API........................................................................ 408
Отказ от предупреждений о нерекомендованности при импорте ................................ 409
Резюме..................................................................................................................................................... 410
Глава 16. Навигация по стеку..................................................................................411
Что такое стек?..................................................................................................................................... 411
Что такое навигация по стеку? ...................................................................................................... 412
Навигация по стеку JDK 8 ................................................................................................................ 412
Недостатки навигации по стеку .................................................................................................... 415
Навигация по стеку в JDK 9............................................................................................................. 416
Параметры навигации по стеку ....................................................................................................416
Представление кадра стека............................................................................................................416
Получение экземпляра StackWalker............................................................................................418
Навигация по стеку.............................................................................................................................419
Получение вызывающего класса .................................................................................................424
Права для навигации по стеку........................................................................................................427
Резюме..................................................................................................................................................... 429
Глава 17. Реактивные потоки ..................................................................................431
Что такое поток?.................................................................................................................................. 431
Что такое реактивные потоки?...................................................................................................... 432
API реактивных потоков в JDK 9................................................................................................... 434
Взаимодействия между издателем и подписчиком .............................................................435
Создание издателя..............................................................................................................................436
Публикация данных...........................................................................................................................436
Простой пример ..................................................................................................................................437
Создание подписчиков.....................................................................................................................439
Использование процессоров .........................................................................................................445
Резюме..................................................................................................................................................... 448
Глава 18. Изменения API потоков ..........................................................................450
Новые потоковые операции........................................................................................................... 450
Новые коллекторы.............................................................................................................................. 454
Резюме..................................................................................................................................................... 460
Глава 19. Протоколирование на уровне платформы и JVM...............................461
API платформенного протоколирования................................................................................... 461
12  Оглавление
Подготовка библиотеки Log4j 2.0 ................................................................................................462
Подготовка проекта NetBeans.......................................................................................................462
Определение модуля.........................................................................................................................462
Добавление конфигурационного файла Log4j.......................................................................464
Создание системного диспетчера протоколирования ........................................................465
Создание локатора диспетчера протоколирования.............................................................467
Тестирование платформенного модуля.....................................................................................468
Унифицированное протоколирование JVM.............................................................................. 472
Метки сообщений ............................................................................................................................... 473
Уровни сообщений.............................................................................................................................474
Декораторы сообщений...................................................................................................................474
Место назначения сообщения.......................................................................................................475
Синтаксис параметра -Xlog.............................................................................................................476
Резюме..................................................................................................................................................... 479
Глава 20. Другие изменения в JDK 9......................................................................481
Знак подчеркивания — ключевое слово ................................................................................... 482
Усовершенствование блоков try с ресурсами......................................................................... 483
Ромбовидный оператор в анонимных классах.......................................................................487
Закрытые методы в интерфейсах ................................................................................................ 490
Применение аннотации @SafeVarargs к закрытым методам.......................................... 492
Отбрасывание вывода процесса .................................................................................................. 494
Новые методы класса StrictMath.................................................................................................. 496
Изменения в классе ClassLoader.................................................................................................. 498
Новые методы в классе Optional .......................................................................................... 499
Новые методы класса CompletableFuture......................................................................... 502
Уведомления об активном ожидании......................................................................................... 502
Улучшения в Time API........................................................................................................................ 504
Класс Clock.............................................................................................................................................504
Класс Duration......................................................................................................................................504
Преобразование промежутка времени и выделение его частей ...................................505
Фабричный метод ofInstant().........................................................................................................507
Получение числа секунд от начала отсчета.............................................................................508
Поток объектов LocalDate................................................................................................................509
Новые параметры форматирования...........................................................................................510
Класс Scanner и потоковые операции........................................................................................ 512
Улучшения в классе Matcher .......................................................................................................... 513
Улучшения в классе Objects............................................................................................................ 515
Сравнение массивов.......................................................................................................................... 516
API аплетов объявлен нерекомендуемым................................................................................ 519
Усовершенствования в документации Java.............................................................................. 519
Поддержка платформенного рабочего стола ......................................................................... 522
Фильтры десериализации объектов............................................................................................ 526
Добавления в API ввода-вывода .................................................................................................. 535
Резюме..................................................................................................................................................... 536
Предметный указатель ............................................................................................539