Автор оригинала: mkyong.
Java 15 стала общедоступной 15 сентября 2020 года, загрузите Java 15 здесь .
Функции Java 15.
- 1. JEP 339: Алгоритм цифровой подписи Edwards-Curve (DSA)
- 2. JEP 360: Закрытые классы (предварительный просмотр)
- 3. JEP 371: Скрытые Классы
- 4. JEP 372: Удалите движок JavaScript Nashorn
- 5. JEP 373: Переопределите устаревший API DatagramSocket
- 6. JEP 374: Отключить и запретить Смещенная блокировка
- 7. JEP 375: Сопоставление с образцом, например (второй предварительный просмотр)
- 8. JEP 377: ZGC: Масштабируемый Сборщик Мусора с Низкой задержкой
- 9. JEP 378: Текстовые блоки
- 10. JEP 379: Шенандоа: Сборщик мусора с низким временем паузы
- 11. JEP 381: Удалите Solaris и SPARC Порты
- 12. JEP 383: API доступа к внешней памяти (второй инкубатор)
- 13. JEP 384: Записи (второй предварительный просмотр)
- 14. JEP 385: Отмените активацию RMI для удаления
Функции разработчика Java 15.
Запечатанные типы (предварительный просмотр), записи (второй предварительный просмотр), сопоставление с образцом (второй предварительный просмотр), скрытые классы, текстовые блоки или многострочные (стандартные), API доступа к внешней памяти (второй инкубатор).
Примечание Что нового в последней версии Java 16 .
1. JEP 339: Алгоритм цифровой подписи Edwards-Curve (DSA)
Материал, связанный с криптографией, Java 15 реализует дополнительную схему цифровой подписи с использованием алгоритма цифровой подписи Edwards-Curve (EdDSA) , как описано в RFC 8032 . Схема подписи Dsa популярна благодаря своей повышенной безопасности и производительности (быстрее) по сравнению с другими схемами подписи, а также является одной из схем подписей, которые разрешены в TLS 1.3 .
Просмотрите алгоритмы подписи Java 15 |/.
Пример кода.
package com.mkyong.java15.jep339;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.Base64;
public class JEP339 {
public static void main(String[] args)
throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
KeyPair kp = kpg.generateKeyPair();
byte[] msg = "abc".getBytes(StandardCharsets.UTF_8);
Signature sig = Signature.getInstance("Ed25519");
sig.initSign(kp.getPrivate());
sig.update(msg);
byte[] s = sig.sign();
System.out.println(Base64.getEncoder().encodeToString(s));
}
}
Дальнейшее чтение
2. JEP 360: Закрытые классы (предварительный просмотр)
В этом джипе появилось несколько новых ключевых слов, запечатанные , не запечатанные , разрешения для поддержки запечатанных классов и интерфейсов . Закрытые классы и интерфейсы ограничивают, кто может быть подтипом.
2.1 Приведенный ниже запечатанный интерфейс позволил реализовать его трем указанным подклассам.
public sealed interface Command
permits LoginCommand, LogoutCommand, PluginCommand{
//...
}
2.2 Для недопустимого класса он выдает ошибки во время компиляции:
public final class UnknownCommand implements Command {
//...
}
class is not allowed to extend sealed class: Command
2.3 Запечатанный класс должен иметь подклассы и Каждый разрешенный подкласс должен выбрать модификатор (запечатанный, не запечатанный, окончательный), чтобы описать, как он продолжает запечатывание, инициированное его суперклассом
окончательный
// close, dun extends me
public final class LoginCommand implements Command{
}
запечатанный
// another sealed class
// sealed class must have subclasses
public sealed class LogoutCommand implements Command
permits LogoutAndDeleteCachedCommand {
}
// Sealed this class again if you want
public final class LogoutAndDeleteCachedCommand extends LogoutCommand {
}
не запечатанный
// open...up to you to play this
// Create custom plugin by extending this class
public non-sealed class PluginCommand implements Command {
}
Примечание Вы заметили ключевое слово не запечатанный ? Я думаю, что это первое ключевое слово с дефисом в Java. Однако это функция предварительного просмотра; ключевое слово может измениться в будущем выпуске.
2.4 Этот запечатанный класс или разрешенные подклассы и соответствие образцу |/.
switch (command) {
case LoginCommand: // login
case LogoutCommand: // logout
case PluginCommand: // custom plugin
// no default needed, only permits 3 sub-classes
}
P.S Запечатанный класс имеет второй предварительный просмотр в Java 16, JEP 397 .
Дальнейшее чтение
- JEP 360: Закрытые классы (предварительный просмотр)
- Почему мы разрешаем распространять запечатанный класс на незапечатанный класс?
3. JEP 371: Скрытые Классы
3.1 В этом JEEP представлены скрытые классы, которые невозможно обнаружить и которые имеют ограниченный жизненный цикл (более короткий срок службы), что хорошо для разработчиков, которые динамически генерируют классы во время выполнения. И теперь мы можем использовать этот новый Поиск::определение скрытого класса API для создания скрытого класса или интерфейса из байтов.
3.2 Пример кода для использования определения скрытого класса для создания скрытого класса из класса с кодировкой Base64 и запуска статического метода поиска вручную.
package com.mkyong.java15.jep371;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.Base64;
public class LookupProxyTest {
//Here is the Base64 encoded class.
/*
package com.mkyong.java15.jep371;
public class LookUpProxy{
public static Integer lookup() {
return 1;
}
}*/
static final String CLASS_IN_BASE64 =
"yv66vgAAADcAFQoABAANCgAOAA8HABAHABEBAAY8aW5pdD4BAAMoKV" +
"YBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQAGbG9va3VwAQAVKClM" +
"amF2YS9sYW5nL0ludGVnZXI7AQAKU291cmNlRmlsZQEAEExvb2tVcF" +
"Byb3h5LmphdmEMAAUABgcAEgwAEwAUAQAkY29tL21reW9uZy9qYXZh" +
"MTUvamVwMzcxL0xvb2tVcFByb3h5AQAQamF2YS9sYW5nL09iamVjdA" +
"EAEWphdmEvbGFuZy9JbnRlZ2VyAQAHdmFsdWVPZgEAFihJKUxqYXZh" +
"L2xhbmcvSW50ZWdlcjsAIQADAAQAAAAAAAIAAQAFAAYAAQAHAAAAHQ" +
"ABAAEAAAAFKrcAAbEAAAABAAgAAAAGAAEAAAADAAkACQAKAAEABwAA" +
"AB0AAQAAAAAABQS4AAKwAAAAAQAIAAAABgABAAAABgABAAsAAAACAAw=";
public static void main(String[] args) throws Throwable {
//byte[] array = Files.readAllBytes(
// Paths.get("/home/mkyong/test/LookUpProxy.class"));
//String s = Base64.getEncoder().encodeToString(array);
//System.out.println(s);
testHiddenClass();
}
// create a hidden class and run its static method
public static void testHiddenClass() throws Throwable {
byte[] classInBytes = Base64.getDecoder().decode(CLASS_IN_BASE64);
Class> proxy = MethodHandles.lookup()
.defineHiddenClass(classInBytes,
true, MethodHandles.Lookup.ClassOption.NESTMATE)
.lookupClass();
// output: com.mkyong.java15.jep371.LookUpProxy/0x0000000800b94440
System.out.println(proxy.getName());
MethodHandle mh = MethodHandles.lookup().findStatic(proxy,
"lookup",
MethodType.methodType(Integer.class));
Integer status = (Integer) mh.invokeExact();
System.out.println(status);
}
}
Выход
com.mkyong.java15.jep371.LookUpProxy/0x0000000800b94440 1
3.3 Этот JEP также устарел Unsafe.defineanonymousclass API и пометил его для удаления в будущем. Пожалуйста, больше не используйте этот API.
byte[] classInBytes = Base64.getDecoder().decode(CLASS_IN_BASE64);
Field theUnsafe = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
sun.misc.Unsafe unsafe = (sun.misc.Unsafe)theUnsafe.get(null);
// @Deprecated(since = "15", forRemoval = false)
Class> proxy = unsafe.defineAnonymousClass(
LookupProxyTest.class, classInBytes, null);
Дальнейшее чтение
4. JEP 372: Удалите движок JavaScript Nashorn
- Java 8 JEP 174 представила Nashorn в качестве замены движка Javascript Rhino.
- Java 11 JEP 335 устарел движок JavaScript Nashorn и
jjsинструмент. - Теперь Java 15 навсегда удалила движок JavaScript Nashorn и инструмент
jjs.
Этот JEP также удалил следующие два модуля:
jdk.scripting.nashorn– содержитjdk.nashorn.api.сценариииjdk.nashorn.api.деревопакеты.jdk.scripting.nashorn.shell– содержит инструмент jjs.
Дальнейшее чтение
5. JEP 373: Переопределите устаревший API DatagramSocket
- Java 13 JEP 353 переопределил устаревшие API сокетов –
java.net . Гнездоиjava.net . Серверный карман. - На этот раз Java 15 переопределила устаревшие API DatagramSocket –
java.net . Датаграмсокетиjava.net . Многоадресная рассылка.
Дальнейшее чтение
6. JEP 374: Отключить и запретить Смещенная блокировка
Этот JEP отключил и устарел блокировку со смещением по умолчанию. До Java 15 предвзятая блокировка всегда включалась по умолчанию, что давало прирост производительности для синхронизированного материала.
Более старое или устаревшее приложение Java использует API-интерфейсы синхронизации коллекций, такие как Hashtable и Вектор , а смещенная блокировка может повысить производительность. В настоящее время более новое приложение Java обычно использует несинхронизированные коллекции Хэш-карта и ArrayList , и прирост производительности от смещенной блокировки, как правило, сейчас менее полезен.
Однако для Java 15 мы все еще можем включить смещенную блокировку с помощью -XX:+Блокировка при использовании , но это вызовет предупреждение виртуальной машины для устаревшего API.
# Java 15 $ java -XX:+UseBiasedLocking name OpenJDK 64-Bit Server VM warning: Option UseBiasedLocking was deprecated in version 15.0 and will likely be removed in a future release.
Дальнейшее чтение
- JEP 374: Отключение и осуждение предвзятого Запирающийся
- stackoverflow – Смещенная блокировка в java
7. JEP 375: Сопоставление с образцом, например (второй предварительный просмотр)
Java 14 JEP 305 введена Сопоставление с образцом в качестве функции предварительного просмотра. Этот JEP представляет собой второй предварительный просмотр сопоставления шаблонов для получения дополнительной обратной связи без изменений в API.
Типичный instanceof-и-приведение для проверки типа объекта и приведения его.
private static void print(Object obj) {
if (obj instanceof String) { // instanceof
String s = (String) obj; // cast
if ("java15".equalsIgnoreCase(s)) {
System.out.println("Hello Java 15");
}
} else {
System.out.println("not a string");
}
}
Для сопоставления с образцом мы можем проверять, отбрасывать и привязывать в одной строке.
private static void printWithPatternMatching(Object obj) {
// instanceof, cast and bind variable in one line.
if (obj instanceof String s) {
if ("java15".equalsIgnoreCase(s)) {
System.out.println("Hello Java 15");
}
} else {
System.out.println("not a string");
}
}
P.S Сопоставление с образцом является стандартной функцией в Java 16, JEP 394 .
Дальнейшее чтение
8. JEP 377: ZGC: Масштабируемый Сборщик Мусора с Низкой задержкой
Java 11 JEP 333 представила сборщик мусора GC в качестве экспериментальной функции.
- Этот JEEP исправил некоторые ошибки, добавил некоторые функции и улучшения и теперь поддерживает основные платформы, такие как Linux/x86_64, Linux/aarch64, Windows и macOS.
- Этот JEP также превращает сборщик мусора Z из экспериментальной функции в функцию продукта. Однако сборщик мусора по умолчанию остается G1 .
Приведенная ниже команда включает сборщик мусора GC.
$ java -XX:+UseZGC className
Дальнейшее чтение
9. JEP 378: Текстовые блоки
Наконец, многострочные строки или текстовые блоки являются постоянной функцией в Java 15.
История:
- Java 12 JEP 326 Необработанных строковых литералов
- Java 13 JEP 355: Текстовые блоки (предварительный просмотр)
- Java 14 JEP 368: Текстовые блоки (второй предварительный просмотр)
- Java 15, постоянная функция.
Пример кода.
String html = "\n" +
" \n" +
" Hello, World
\n" +
" \n" +
"\n";
String java15 = """
Hello, World
""";
Дальнейшее чтение
10. JEP 379: Шенандоа: Сборщик мусора с низким временем паузы
Java 12 JEP 189 представил сборщик мусора Шенандоа в качестве экспериментальной функции, а теперь стал функцией продукта в Java 15.
До Java 15 нам нужно -XX:+Разблокируйте экспериментальные возможности --XX:+Используйте ГК Шенандоа чтобы включить GC Шенандоа.
java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC
В Java 15 нам нужно только --XX:+Используйте GC Шенандоа для включения GC Шенандоа.
java -XX:+UseShenandoahGC
Однако официальная сборка OpenJDK 15 не включала GC Shenandoah (точно так же, как это произошло в Java 12). Прочитайте эту историю – Не все сборки OpenJDK 12 включают Shenandoah: Вот почему .
$ java -XX:+UseShenandoahGC ClassName Error occurred during initialization of VM Option -XX:+UseShenandoahGC not supported $ java -version openjdk version "15" 2020-09-15 OpenJDK Runtime Environment (build 15+36-1562) OpenJDK 64-Bit Server VM (build 15+36-1562, mixed mode, sharing)
Чтобы попробовать Shenandoah GC, нам нужны другие сборки JDK, такие как AdoptOpenJDK .
$ java -XX:+UseShenandoahGC ClassName $ java -version openjdk version "15" 2020-09-15 OpenJDK Runtime Environment AdoptOpenJDK (build 15+36) OpenJDK 64-Bit Server VM AdoptOpenJDK (build 15+36, mixed mode, sharing)
P.S Сборщик мусора по умолчанию остается G1 .
Дальнейшее чтение
11. JEP 381: Удалите Solaris и SPARC Порты
Java 14 JEP 362 устарели порты Solaris/SPARC, Solaris/x64 и Linux/SPARC, и теперь они официально удалены в Java 15.
Дальнейшее чтение
12. JEP 383: API доступа к внешней памяти (второй инкубатор)
Java 14 JEP 370 представила новый API доступа к внешней памяти в качестве Инкубаторных модулей . Этот ДЖИП внес некоторые изменения в API, и он все еще будет находиться в модулях инкубатора.
Пример кода
import jdk.incubator.foreign.MemoryAddress;
import jdk.incubator.foreign.MemoryHandles;
import jdk.incubator.foreign.MemorySegment;
import java.lang.invoke.VarHandle;
import java.nio.ByteOrder;
public class HelloForeignMemory {
public static void main(String[] args) {
VarHandle intHandle = MemoryHandles.varHandle(
int.class, ByteOrder.nativeOrder());
try (MemorySegment segment = MemorySegment.allocateNative(1024)) {
MemoryAddress base = segment.baseAddress();
// print memory address
System.out.println(base);
// set value 999 into the foreign memory
intHandle.set(base, 999);
// get the value from foreign memory
System.out.println(intHandle.get(base));
}
}
}
Нам нужно добавить --add-modules jdk.incubator.foreign , чтобы включить модули инкубатора jdk.incubator.foreign .
$ javac --add-modules jdk.incubator.foreign HelloForeignMemory.java
warning: using incubating module(s): jdk.incubator.foreign
1 warning
$ java --add-modules jdk.incubator.foreign HelloForeignMemory
WARNING: Using incubator modules: jdk.incubator.foreign
MemoryAddress{ region: MemorySegment{ id=0x27c908f5 limit: 1024 } offset=0x0 }
999
Дальнейшее чтение
13. JEP 384: Записи (второй предварительный просмотр)
Java 14 JEP 359 представила записи в качестве функции предварительного просмотра. Этот JEP расширил записи с помощью таких функций, как поддержка запечатанных типов, локальных записей, аннотаций к записям и API-интерфейсов отражения для записей.
13.1 Записи и запечатанные типы
public sealed interface Fruit permits Apple, Orange {}
record Apple() implements Fruit{}
record Orange() implements Fruit{}
13.2 Локальные записи – записи объявляются внутри метода.
Приведенный ниже фрагмент кода использует локальную запись для улучшения читаемости потоковых операций.
ListfindTopMerchants(List merchants, int month) { // Local record record MerchantSales(Merchant merchant, double sales) { } return merchants.stream() .map(merchant -> new MerchantSales(merchant, computeSales(merchant, month))) .sorted((m1, m2) -> Double.compare(m2.sales(), m1.sales())) .map(MerchantSales::merchant) .collect(toList()); } private double computeSales(Merchant merchant, int month) { // some business logic to get the sales... return ThreadLocalRandom.current().nextDouble(100, 10000); }
13.3 Примечания к записям
public record Game(@CustomAnno Rank rank) { ... }
13.4 API отражения
В java.lang. Класс добавлены два общедоступных метода:
Компонент записи[] Компоненты GetRecord()логическое значение isRecord()
P.S Запись является стандартной функцией в Java 16, ДЖИП 395 .
Дальнейшее чтение
14. JEP 385: Отмените активацию RMI для удаления
Этот JEP исключил устаревший механизм активации |/RMI |/. Это не повлияет на другие части RMI.
Дальнейшее чтение
Скачать Исходный Код
$ клон git $ клон git
$ cd java-15
Рекомендации
- Проект OpenJDK 15
- Вспышка облака – Что нового в TLS 1.3?
- Википедия – Алгоритм цифровой подписи Эдвардса-кривой (EdDSA)
- RFC 8032
- Сопоставление шаблонов для Java
- Предвзятая блокировка в горячей точке
- Вики – сайт OpenJDK – ZCG
- Oracle – Сборщик мусора Z
- Сборщик мусора G1
- Сборщик мусора Шенандоа
- JEP 11: Инкубаторные модули
- История версий Java
Оригинал: “https://mkyong.com/java/what-is-new-in-java-15/”