Рубрики
Без рубрики

Новые функции в Java 9

Быстрое и практичное руководство по наиболее интересным функциям, поступающим на Java 9.

Автор оригинала: baeldung.

Новые функции в Java 9

1. Обзор

Java 9 поставляется с богатым набором функций. Несмотря на отсутствие новых языковых концепций, новые API и диагностические команды, безусловно, будут интересны разработчикам.

В этой записи мы будем иметь быстрый, высокий уровень взглянуть на некоторые из новых функций; полный список новых функций доступен здесь .

2. Модульная система – Jigsaw проекта

Начнем с большого – привнести модульность в платформу Java.

Модульная система предоставляет возможности, аналогичные системе osGi framework. Модули имеют концепцию зависимостей, могут экспортировать общедоступный API и сохранять детали реализации скрытыми/частными.

Одной из главных мотиваций здесь является предоставление модульного JVM, который может работать на устройствах с гораздо меньше доступной памяти. JVM может работать только с теми модулями и API, которые требуются приложению. Отъезд эта ссылка для описания того, что эти модули.

Кроме того, внутренние (реализационо) API СПМ, такие как com.sun.» больше не доступны из кода приложения.

Проще говоря, модули будут описаны в файле под названием модуль-инфо.java расположен в верхней части иерархии кода Java:

module com.baeldung.java9.modules.car {
    requires com.baeldung.java9.modules.engines;
    exports com.baeldung.java9.modules.car.handling;
}

Наш модуль автомобильный требуется модульная двигатель для запуска и экспорта пакета для обработка .

Для получения более подробной проверки примера OpenJDK Проект Jigsaw: Модуль системы быстрого запуска руководство .

3. Новый клиент HTTP

Долгожданная замена старого HttpURLConnection .

Новый API расположен под java.net.http пакет.

Она должна поддерживать обе Http/2 протокол и WebSocket рукопожатие, с производительностью, которая должна быть сопоставима с Apache HttpClient , Нетти и Причал .

Давайте посмотрим на эту новую функциональность, создав и отправив простой запрос HTTP.

Обновление: HTTP Клиент JEP перемещается в модуль инкубатора, поэтому он больше не доступен в пакете java.net.http и вместо этого доступен под jdk.incubator.http.

3.1. Быстрый запрос GET

API использует шаблон Builder, что делает его очень простым для быстрого использования:

HttpRequest request = HttpRequest.newBuilder()
  .uri(new URI("https://postman-echo.com/get"))
  .GET()
  .build();

HttpResponse response = HttpClient.newHttpClient()
  .send(request, HttpResponse.BodyHandler.asString());

4. Процесс API

API процесса был усовершенствован для управления и управления процессами операционной системы.

4.1. Информация о процессах

Классная java.lang.ProcessHandle содержит большинство новых функций:

ProcessHandle self = ProcessHandle.current();
long PID = self.getPid();
ProcessHandle.Info procInfo = self.info();
 
Optional args = procInfo.arguments();
Optional cmd =  procInfo.commandLine();
Optional startTime = procInfo.startInstant();
Optional cpuUsage = procInfo.totalCpuDuration();

текущие метод возвращает объект, представляющий процесс запуска JVM. Информация подкласс предоставляет подробную информацию о процессе.

4.2. Уничтожение процессов

Теперь – давайте прекратим все запуски детских процессов с помощью уничтожить () :

childProc = ProcessHandle.current().children();
childProc.forEach(procHandle -> {
    assertTrue("Could not kill process " + procHandle.getPid(), procHandle.destroy());
});

5. Малые языковые изменения

5.1. Попробуйте с ресурсами

В Java 7, попробовать с ресурсами синтаксис требует, чтобы для каждого ресурса, управляемого заявлением, была объявлена свежая переменная.

В Java 9 есть дополнительная доработка: если на ресурс ссылается окончательная или фактически окончательная переменная, выписка try-with-resources может управлять ресурсом без объявленной новой переменной:

MyAutoCloseable mac = new MyAutoCloseable();
try (mac) {
    // do some stuff with mac
}
 
try (new MyAutoCloseable() { }.finalWrapper.finalCloseable) {
   // do some stuff with finalCloseable
} catch (Exception ex) { }

5.2. Расширение алмазного оператора

Теперь мы можем использовать алмазный оператор в сочетании с анонимными внутренними классами:

FooClass fc = new FooClass<>(1) { // anonymous inner class
};
 
FooClass fc0 = new FooClass<>(1) { 
    // anonymous inner class
};
 
FooClass fc1 = new FooClass<>(1) { // anonymous inner class
};

5.3. Интерфейс частный метод

Интерфейсы в предстоящей версии JVM могут иметь частные методы, которые могут быть использованы для разделения длительных методов по умолчанию:

interface InterfaceWithPrivateMethods {
    
    private static String staticPrivate() {
        return "static private";
    }
    
    private String instancePrivate() {
        return "instance private";
    }
    
    default void check() {
        String result = staticPrivate();
        InterfaceWithPrivateMethods pvt = new InterfaceWithPrivateMethods() {
            // anonymous class
        };
        result = pvt.instancePrivate();
    }
}}

6. Инструмент командной линии JShell

JShell — цикл чтения и печати — REPL для краткости.

Проще говоря, это интерактивный инструмент для оценки деклараций, заявлений и выражений Java вместе с API. Это очень удобно для тестирования небольших фрагментов кода, которые в противном случае требуют создания нового класса с основные метод.

jshell выполняется себя можно найти в /бин папка:

jdk-9\bin>jshell.exe
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro
jshell> "This is my long string. I want a part of it".substring(8,19);
$5 ==> "my long string"

Интерактивная оболочка поставляется с историей и авто-завершение; он также предоставляет такие функциональные возможности, как сохранение и загрузка файлов, всех или некоторых письменных заявлений:

jshell> /save c:\develop\JShell_hello_world.txt
jshell> /open c:\develop\JShell_hello_world.txt
Hello JShell!

Фрагменты кода выполняются при загрузке файла.

7. JCMD Подпоко команды

Давайте рассмотрим некоторые из новых подкомманд в jcmd утилита командной строки. Мы получим список всех классов, загруженных в JVM и их структуру наследования.

В приведеном ниже примере мы можем увидеть иерархию java.lang.Socket загружен в JVM работает Eclipse Neon:

jdk-9\bin>jcmd 14056 VM.class_hierarchy -i -s java.net.Socket
14056:
java.lang.Object/null
|--java.net.Socket/null
|  implements java.io.Closeable/null (declared intf)
|  implements java.lang.AutoCloseable/null (inherited intf)
|  |--org.eclipse.ecf.internal.provider.filetransfer.httpclient4.CloseMonitoringSocket
|  |  implements java.lang.AutoCloseable/null (inherited intf)
|  |  implements java.io.Closeable/null (inherited intf)
|  |--javax.net.ssl.SSLSocket/null
|  |  implements java.lang.AutoCloseable/null (inherited intf)
|  |  implements java.io.Closeable/null (inherited intf)

Первый параметр jcmd команда — это идентификатор процесса (PID) JVM, на котором мы хотим запустить команду.

Еще одна интересная подкоманда set_vmflag . Мы можем изменить некоторые параметры JVM онлайн, без необходимости перезапуска процесса JVM и изменения параметров его запуска.

Вы можете узнать все доступные флаги VM с подкомандной jcmd 14056 VM.flags – все

8. API изображения с разрешением Мульти

Интерфейс java.awt.image.MultiResolutionImage инкапсулирует набор изображений с разным разрешением в один объект. Мы можем получить вариант изображения с разрешением, основанный на данной метрике DPI и наборе преобразований изображения, или получить все варианты изображения.

java.awt.Graphics класс получает вариант из изображения с разрешением нескольких разрешений, основанного на текущей метрике DPI дисплея и любых прикладных преобразованиях.

Классная java.awt.image.BaseMultiResolutionImage обеспечивает базовую реализацию:

BufferedImage[] resolutionVariants = ....
MultiResolutionImage bmrImage
  = new BaseMultiResolutionImage(baseIndex, resolutionVariants);
Image testRVImage = bmrImage.getResolutionVariant(16, 16);
assertSame("Images should be the same", testRVImage, resolutionVariants[3]);

9. Переменные ручки

API находится под java.lang.invoke и состоит из ВарХендл и МетодХендлс . Он обеспечивает эквиваленты java.util.concurrent.atomic и sun.misc.Небезопасные операции на полях объектов и элементах массива с аналогичной производительностью.

С Java 9 Модульная система доступа к sun.misc.Небезопасно не будет возможно из кода приложения.

10. Опубликовать-Подписаться Рамки

Классная java.util.concurrent.Flow предоставляет интерфейсы, которые поддерживают Реактивные потоки опубликовать-подписаться рамки. Эти интерфейсы поддерживают совместимость ряда асинхронных систем, работающих на JVM.

Мы можем использовать утилиту класса ПредставлениеОпубликова для создания пользовательских компонентов.

11. Единый JVM журнал

Эта функция вводит общую систему регистрации для всех компонентов JVM. Он предоставляет инфраструктуру для ведения журналов, но не добавляет фактические вызовы журнала из всех компонентов JVM. Он также не добавляет журнал в код Java в JDK.

Рамки регистрации определяют набор теги – например, gc , компилятор , нити и так далее. Мы можем использовать параметр командной строки -Xlog включить журнал во время запуска.

Давайте заготовим сообщения, помеченные тегом ‘gc’, используя уровень ‘отладки’ в файл под названием ‘gc.txt’ без украшений:

java -Xlog:gc=debug:file=gc.txt:none ...

-Xlog:помощь вы увидите возможные варианты и примеры. Конфигурация регистрации может быть изменена во время выполнения с jcmd команда. Мы собираемся установить журналы GC для информации и перенаправить их в файл – gc_logs:

jcmd 9615 VM.log output=gc_logs what=gc

12. Новые API

12.1. Неизменяемый набор

java.util.Set.of() – создает непреложный набор данных элементов. В Java 8 для создания набора из нескольких элементов потребуется несколько строк кода. Теперь мы можем сделать это так просто, как:

Set strKeySet = Set.of("key1", "key2", "key3");

Установить возвращается этим методом внутренний класс JVM: java.util.ImmutableCollections.SetN , который расширяет общественные java.util.AbstractSet . Это непреложно – если мы попытаемся добавить или удалить элементы, НеподдерживаемаяОперацияЭксцепция будут брошены.

Вы также можете преобразовать весь массив в Установить с тем же методом.

12.2. Необязательно к потоку

java.util.Optional.stream () дает нам простой способ использования энергии Streams на дополнительных элементах:

List filteredList = listOfOptionals.stream()
  .flatMap(Optional::stream)
  .collect(Collectors.toList());

13. Заключение

Java 9 будет оснащен модульным JVM и множеством других новых и разнообразных улучшений и функций.

Вы можете найти исходный код для примеров более на GitHub .