Обзор новых функций в Java 9
102: Process API Updates
110: HTTP 2 Client
143: Improve Contended Locking
158: Unified JVM Logging
165: Compiler Control
193: Variable Handles
197: Segmented Code Cache
199: Smart Java Compilation, Phase Two
200: The Modular JDK
201: Modular Source Code
211: Elide Deprecation Warnings on Import Statements
212: Resolve Lint and Doclint Warnings
213: Milling Project Coin
214: Remove GC Combinations Deprecated in JDK 8
215: Tiered Attribution for javac
216: Process Import Statements Correctly
217: Annotations Pipeline 2.0
219: Datagram Transport Layer Security (DTLS)
220: Modular Run-Time Images
221: Simplified Doclet API
222: jshell: The Java Shell (Read-Eval-Print Loop)
223: New Version-String Scheme
224: HTML5 Javadoc
225: Javadoc Search
226: UTF-8 Property Files
227: Unicode 7.0
228: Add More Diagnostic Commands
229: Create PKCS12 Keystores by Default
231: Remove Launch-Time JRE Version Selection
232: Improve Secure Application Performance
233: Generate Run-Time Compiler Tests Automatically
235: Test Class-File Attributes Generated by javac
236: Parser API for Nashorn
237: Linux/AArch64 Port
238: Multi-Release JAR Files
240: Remove the JVM TI hprof Agent
241: Remove the jhat Tool
243: Java-Level JVM Compiler Interface
244: TLS Application-Layer Protocol Negotiation Extension
245: Validate JVM Command-Line Flag Arguments
246: Leverage CPU Instructions for GHASH and RSA
247: Compile for Older Platform Versions
248: Make G1 the Default Garbage Collector
249: OCSP Stapling for TLS
250: Store Interned Strings in CDS Archives
251: Multi-Resolution Images
252: Use CLDR Locale Data by Default
253: Prepare JavaFX UI Controls & CSS APIs for Modularization
254: Compact Strings
255: Merge Selected Xerces 2.11.0 Updates into JAXP
256: BeanInfo Annotations
257: Update JavaFX/Media to Newer Version of GStreamer
258: HarfBuzz Font-Layout Engine
259: Stack-Walking API
260: Encapsulate Most Internal APIs
261: Module System
262: TIFF Image I/O
263: HiDPI Graphics on Windows and Linux
264: Platform Logging API and Service
265: Marlin Graphics Renderer
266: More Concurrency Updates
267: Unicode 8.0
268: XML Catalogs
269: Convenience Factory Methods for Collections
270: Reserved Stack Areas for Critical Sections
271: Unified GC Logging
272: Platform-Specific Desktop Features
273: DRBG-Based SecureRandom Implementations
274: Enhanced Method Handles
275: Modular Java Application Packaging
276: Dynamic Linking of Language-Defined Object Models
277: Enhanced Deprecation
278: Additional Tests for Humongous Objects in G1
279: Improve Test-Failure Troubleshooting
280: Indify String Concatenation
281: HotSpot C++ Unit-Test Framework
282: jlink: The Java Linker
283: Enable GTK 3 on Linux
284: New HotSpot Build System
285: Spin-Wait Hints
287: SHA-3 Hash Algorithms
288: Disable SHA-1 Certificates
289: Deprecate the Applet API
290: Filter Incoming Serialization Data
291: Deprecate the Concurrent Mark Sweep (CMS) Garbage Collector
292: Implement Selected ECMAScript 6 Features in Nashorn
294: Linux/s390x Port
295: Ahead-of-Time Compilation
297: Unified arm32/arm64 Port
298: Remove Demos and Samples
299: Reorganize Documentation
- модульная система
Модульность — это очень общее понятие. В программном обеспечении модульность может применяться для написания и реализации программы и вычислительной системы как отдельных модулей, а не как единой и законченной конструкции.
Основное изменение в Java 9 — реализованная модульная система. Внедрение модульности позволяет использовать JDK в устройствах меньшего размера. Приложениям, использующим модульную систему, нужны только те части модулей JDK, которые требуются этим приложениям, а не вся структура JDK. Модульная система также может инкапсулировать общие классы в модуль. Поэтому класс, определенный как общедоступный, инкапсулированный в модуль, не может использоваться нигде, если модуль не определяет модуль явно. Из-за этого изменения в Java 9 внутренние API-интерфейсы Java (например, com.sun.*) недоступны по умолчанию.
Все модули должны быть описаны в файле module-ionfo.java, который находится на верхнем уровне структуры кода Java.
module me.aboullaite.java9.modules.car {
requires me.aboullaite.java9.modules.engines;//依赖的模块
exports me.aboullaite.java9.modules.car.handling;//在模块中导出的包
}
Наш модуль car (автомобиль) должен зависеть от модуля + engine (двигатель) и должен экспортировать пакет обработки (операции).
Дополнительные примеры можно найти в проекте OpenJDK Jigsaw: A Quick Start to the Modular System.
- JShell — Java 9 REPL
REPL — это инструмент командной строки для быстрого запуска операторов.
В Java, если вы хотите выполнить простой оператор, мы либо создаем класс с основным методом, либо класс Test, который можно выполнить. Когда вы запускаете Java-программу, если вы хотите выполнить определенные операторы и хотите немедленно увидеть результаты, описанный выше подход не кажется очень полезным. (больше похоже на режим командной строки python runner...)
JShell пытается решить эту проблему. Разработчики Java могут использовать JShell для прямого объявления переменных, оценки выражений и выполнения операторов без создания классов. JShell также может загружать операторы из файла или сохранять операторы в файл. И JShell также может иметь функцию автоматического завершения клавиши табуляции.
- Фабричный метод сбора
До Java 9 Java могла создавать набор неизменяемых представлений только с помощью некоторых служебных методов (например: Collections.unmodifiedCollection(Collection extends T> c) ). Например, мы можем создать неизменяемое представление коллекции в Java 8, используя следующий оператор. Хотя это самый простой способ его создать, выглядит он ужасно! не так ли?
Map<String,String> immutableMap =
Collections.unmodifiableMap(
new HashMap<String,String>(){
{
put("key1","value1");
put("key2","value2");
put("key3","value3");
}
});
Некоторые полезные фабричные методы были введены в Java 9 для создания немодифицируемых коллекций:
Map<String,String> immutableMap = Map.of("key1","value1","key2","value2","key3","value3");
Пример фабричного метода выглядит следующим образом:
//不可修改的空集合
List<String> emptyImmutableList = List.of();
Set<String> emptyImmutableSet = Set.of();
Map emptyImmutableMap = Map.of();
//不可修改的集合
List<String> immutableList = List.of("one","two");
Set<String> immutableSet = Set.of("value1","value2");
Map<String,String> immutableMap = Map.of("key1","value1","key2","value2","key3","value3");
- приватные методы в интерфейсах
Интерфейсы в Java 8 представили методы по умолчанию и статические методы. Хотя в Java 8 сначала планировалось реализовать приватные методы интерфейса, это было реализовано в Java 9. Методы по умолчанию и статические методы могут совместно использовать частные методы в интерфейсе, что позволяет избежать избыточности кода, что также делает код чище. Если частный метод является статическим, то этот метод принадлежит интерфейсу. И нет статического приватного метода, который может быть вызван только экземпляром в интерфейсе.
interface InterfaceWithPrivateMethods{
private static String staticPrivate(){
return "static private";
}
private String instancePrivate(){
return "instance private";
}
default void check(){
String result = staticPrivate();
InterfaceWithPrivateMethods p = new InterfaceWithPrivateMethods(){
//匿名类
};
result = p.instancePrivate();
}
}
- реактивная потоковая передача
Flow API в JDK9 соответствует спецификации реактивного потока, которая является стандартом де-факто. JEP 266 содержит минимальный набор интерфейсов, которые охватывают основные асинхронные публикации и подписки.
java.util.concurrent.Flow содержит следующие 4 интерфейса:
Flow.Processor(Процессор)
Flow.Publisher (издатель)
Flow.Subscriber(Подписчик)
Flow.Subscription (менеджер подписки)
Все эти интерфейсы поддерживают инфраструктуру публикации-подписки реактивной потоковой передачи. Java 9 также предоставляет служебный класс SubmissionPublisher. Издатель производит один или несколько элементов, которые потребляются одним или несколькими потребителями. А подписчиками управляет менеджер подписки. Менеджер подписки связывает издателей и подписчиков.
- API изображений с несколькими разрешениями — JEP 251
Цель состоит в том, чтобы определить API изображений с несколькими разрешениями, чтобы разработчики могли легко манипулировать изображениями разных разрешений и отображать их. Этот новый API определен в пакете java.awt.image и может помочь нам следующим образом:
-
Инкапсулирует изображения с разными разрешениями в одно изображение (с несколькими разрешениями) в качестве его варианта.
-
Получить все варианты этого изображения.
-
Получить вариант изображения с определенным разрешением — представляет логическое изображение заданного размера в DPI с известным разрешением, и это изображение является лучшим вариантом.
Класс java.awt.Graphics может получить нужный вариант из интерфейса MultiResolutionImage на основе текущего размера разрешения экрана и применяемого алгоритма преобразования изображения.
Класс java.awt.image.AbstractMultiResolutionImage предоставляет реализацию по умолчанию java.awt.image.AbstractMultiResolutionImage.
Базовой реализацией AbstractMultiResolutionImage является java.awt.image.BaseMultiResolutionImage.
- Улучшения в API процесса
Добавлен API для контроля и управления процессом операционной системы, в Java9 ожидайте, что код получит LINUX PID
Метод в предыдущей версии:
public static void main(String[] args) throws Exception{
Process proc = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c","echo $PPID"});
if(proc.waitFor() == 0){
InputStream in = proc.getInputStream();
int available = in.available();
byte[] outputBytes = new byte[available];
in.read(outputBytes);
String pid = new String(outputBytes);
System.out.println("你的PID是:"+pid);
}
}
Конвертируется следующим образом в java9 (также поддерживает все операционные системы):
System.out.println("你的PID是:" + Process.getCurrentPid());
- Обработка исключений
В Java 7 синтаксис try-with-resources требует объявления новой переменной для каждого ресурса, управляемого оператором try-with-resources.
В 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
}
- расширение ассортимента алмазных операторов
Алмазный оператор в Java 7 упрощает написание кода. В приведенном ниже примере вы можете видеть, что List более удобочитаем в Java 7, но оператор ромба не разрешен для анонимных классов в Java 7, но ситуация улучшилась в Java 9, что позволяет использовать оператор ромб. Оператор используется для анонимных классов. классы. Пример ниже будет компилироваться только в Java 9.
List<String> list = new ArrayList<>(){};
- Расширенная аннотация Устарела
Аннотация @Deprecated может помечать Java API. Аннотация @Deprecated имеет много значений, например, она может указывать на то, что в какой-то момент в ближайшем будущем помеченный API будет удален. Это также может указывать на то, что API не работает и его больше нельзя использовать. У него много других значений. Чтобы предоставить больше информации о @Deprecated, @Deprecated добавляет элемент forRemoval и так как элемент.
Инструмент jdeprscan для сканирования JAR-файлов также доступен в Java SE 9. Инструмент также может сканировать совокупный класс, который использует устаревшие элементы API в Java SE. Этот инструмент будет полезен для приложений, использующих скомпилированную библиотеку, чтобы пользователь не знал, что скомпилированная библиотека использует устаревшие API.
- Единый журнал JVM
Трудно понять основную причину проблем с производительностью JVM и сбоев JVM. Одним из решений этой проблемы является внедрение единой системы для всех компонентов JVM, которая поддерживает детальное и легко настраиваемое ведение журналов JVM. В настоящее время разные компоненты JVM используют разные механизмы и правила ведения журналов, что затрудняет отладку JVM.
- Аннотация @SafeVarargs расширение области действия
До Java 8 @SafeVarargs можно было использовать в статических методах, конечных методах и конструкторах. Но эти методы или конструкторы нельзя переопределить. В одном из этих методов отсутствует другой метод, который нельзя переопределить, и этот метод является частным. Java 9 может добавлять @SafeVarargs к закрытым методам. Следующий пример корректен для Java 9, но выдает ошибку времени компиляции в Java 8: аннотацию @SafeVarargs нельзя использовать в методе не конечного экземпляра iAmSafeVaragrsMethod.
@SafeVarargs
private void iAmSafeVaragrsMethod(String... varagrgs){
for(String each : varagrgs){
System.out.println(each);
}
}
- HTTP2-клиент
В Java 9 представлены новые клиентские API HTTP, которые поддерживают протоколы HTTP/2 и WebSocket и заменяют устаревший HTTPURLConnectionAPI. Эти изменения не должны выполняться в Java 9. Эти API можно получить в модуле инкубатора. Поэтому по умолчанию этот модуль не может быть получен по пути к классам.Вам необходимо настроить этот модуль с опцией команды --add-modules и добавить этот модуль в путь к классам.
Создайте HTTP-запрос и получите асинхронный ответ:
URI testPageURI = new URI("http://127.0.0.1:8080/testPage");
CompletableFuture<HttpResponse> nonBlockingResponse = HttpRequest
.create(testPageURI)
.GET().responseAsync();
int tries = 0;
while(!nonBlockingResponse.isDone() && tries++ < 5){
Thread.sleep(5);
}
if(nonBlockingResponse.isDone()){
HttpResponse response = nonBlockingResponse.get();
System.out.println("satus code :"+response.statusCode()+"-->"+response.body(HttpResponse.asString()));
}else{
nonBlockingResponse.cancel(true);
System.out.println("cancelling,could not get response");
}
- Справочная документация по Java в стиле HTML5
Справочная документация по Java, созданная Java 8 и более ранними версиями, представлена в формате HTML 4, который долгое время был стандартом. В Java 9 в раздел параметров командной строки javadoc был добавлен параметр вывода. Значением этого параметра является либо HTML 4, либо HTML 5. HTML 4 теперь является языком разметки вывода по умолчанию, но в будущих выпусках JDK HTML 5 будет языком разметки вывода по умолчанию. Справочный документ Java по-прежнему состоит из трех фреймов, которая не изменилась, и вывод справочного документа Java в HTML 5 также поддерживает ту же структуру.
- Другие особенности
1. 保留下划线字符。变量不能被命名为_;
2. 废弃Applet API;
3. javac不再支持Java1.4以及之前的版本;
4. 废弃Java浏览器插件;
5. 栈遍历API–栈遍历API能过滤和迟访问在堆栈跟踪中的信息。