Fitur Baru Java 9

1. Ikhtisar

Java 9 hadir dengan serangkaian fitur yang kaya. Meskipun tidak ada konsep bahasa baru, API dan perintah diagnostik baru pasti akan menarik bagi pengembang.

Dalam artikel ini kita akan melihat dengan cepat, tampilan tingkat tinggi pada beberapa fitur baru; daftar lengkap fitur baru tersedia di sini.

2. Sistem Modular - Proyek Jigsaw

Mari kita mulai dengan yang besar - menghadirkan modularitas ke dalam platform Java.

Sistem modular memberikan kemampuan yang mirip dengan sistem kerangka OSGi. Modul memiliki konsep dependensi, dapat mengekspor API publik dan menjaga detail implementasi tetap tersembunyi / pribadi.

Salah satu motivasi utama di sini adalah menyediakan JVM modular, yang dapat berjalan di perangkat dengan memori yang tersedia jauh lebih sedikit. JVM dapat berjalan hanya dengan modul dan API yang diperlukan oleh aplikasi. Lihat tautan ini untuk deskripsi tentang modul-modul ini.

Selain itu, API (implementasi) internal JVM seperti com.sun. * Tidak lagi dapat diakses dari kode aplikasi.

Sederhananya, modul akan dijelaskan dalam file bernama module-info.java yang terletak di bagian atas hierarki kode java:

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

Mobil modul kami membutuhkan mesin modul untuk dijalankan dan mengekspor paket untuk penanganan .

Untuk contoh yang lebih mendalam, periksa OpenJDK Project Jigsaw: Module System Quick-Start Guide.

3. Klien HTTP Baru

Pengganti HttpURLConnection lama yang ditunggu-tunggu .

API baru terletak di bawah paket java.net.http .

Ini harus mendukung protokol HTTP / 2 dan handshake WebSocket, dengan kinerja yang harus sebanding dengan Apache HttpClient, Netty dan Jetty.

Mari kita lihat fungsionalitas baru ini dengan membuat dan mengirim permintaan HTTP sederhana.

Pembaruan: JEP Klien HTTP sedang dipindahkan ke modul Inkubator, sehingga tidak lagi tersedia dalam paket java.net.http dan sebagai gantinya tersedia di bawah jdk.incubator.http.

3.1. Permintaan GET Cepat

API menggunakan pola Builder, yang membuatnya sangat mudah untuk digunakan dengan cepat:

HttpRequest request = HttpRequest.newBuilder() .uri(new URI("//postman-echo.com/get")) .GET() .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandler.asString()); 

4. API Proses

API proses telah ditingkatkan untuk mengontrol dan mengelola proses sistem operasi.

4.1. Informasi Proses

Kelas java.lang.ProcessHandle berisi sebagian besar fungsionalitas baru:

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();

The saat ini metode mengembalikan sebuah objek yang mewakili proses yang sedang berjalan JVM. The Info subclass memberikan rincian tentang proses.

4.2. Proses Penghancuran

Sekarang - mari hentikan semua proses anak yang sedang berjalan menggunakan destroy () :

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

5. Modifikasi Bahasa Kecil

5.1. Try-With-Resources

Di Java 7, sintaks try-with-resources memerlukan variabel baru untuk dideklarasikan untuk setiap resource yang dikelola oleh pernyataan tersebut.

Di Java 9 ada perbaikan tambahan: jika sumber daya direferensikan oleh variabel final atau variabel final yang efektif, pernyataan coba-dengan-sumber daya dapat mengelola sumber daya tanpa variabel baru dideklarasikan:

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. Perpanjangan Operator Berlian

Sekarang kita dapat menggunakan operator berlian dalam hubungannya dengan kelas dalam anonim:

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. Metode Antarmuka Pribadi

Antarmuka dalam versi JVM mendatang dapat memiliki metode privat , yang dapat digunakan untuk membagi metode default yang panjang:

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. Alat Baris Perintah JShell

JShell adalah read – eval – print loop - disingkat REPL.

Sederhananya, ini adalah alat interaktif untuk mengevaluasi deklarasi, pernyataan, dan ekspresi Java, bersama dengan API. Sangat mudah untuk menguji cuplikan kode kecil, yang jika tidak memerlukan pembuatan kelas baru dengan metode utama .

The jshell executable itu sendiri dapat ditemukan di / bin folder:

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"

Shell interaktif dilengkapi dengan sejarah dan penyelesaian otomatis; itu juga menyediakan fungsionalitas seperti menyimpan ke dan memuat dari file, semua atau beberapa pernyataan tertulis:

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

Potongan kode dieksekusi saat file dimuat.

7. Sub-Perintah JCMD

Mari jelajahi beberapa subperintah baru di utilitas baris perintah jcmd . Kami akan mendapatkan daftar semua kelas yang dimuat di JVM dan struktur warisannya.

Pada contoh di bawah ini kita dapat melihat hierarki java.lang.Socket dimuat di JVM yang menjalankan 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) 

Parameter pertama dari perintah jcmd adalah id proses (PID) dari JVM tempat kita ingin menjalankan perintah.

Subperintah menarik lainnya adalah set_vmflag . Kami dapat memodifikasi beberapa parameter JVM secara online, tanpa perlu memulai ulang proses JVM dan mengubah parameter startup-nya.

Anda dapat mengetahui semua flag VM yang tersedia dengan subperintah jcmd 14056 VM.flags -all

8. API Gambar Multi-Resolusi

Antarmuka java.awt.image.MultiResolutionImage merangkum sekumpulan gambar dengan resolusi berbeda ke dalam satu objek. Kami dapat mengambil varian gambar khusus resolusi berdasarkan metrik DPI tertentu dan kumpulan transformasi gambar atau mengambil semua varian pada gambar.

Kelas java.awt.Graphics mendapatkan varian dari gambar multi-resolusi berdasarkan metrik DPI tampilan saat ini dan transformasi apa pun yang diterapkan.

Kelas java.awt.image.BaseMultiResolutionImage menyediakan implementasi dasar:

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

9. Menangani Variabel

API berada di bawah java.lang.invoke dan terdiri dari VarHandle dan MethodHandles . Ini menyediakan operasi yang setara dengan java.util.concurrent.atomic dan sun.misc.Unsafe pada bidang objek dan elemen array dengan kinerja serupa.

Dengan sistem Java 9 Modular, akses ke sun.misc.Unsafe tidak dapat dilakukan dari kode aplikasi.

10. Kerangka Publikasikan-Berlangganan

The class java.util.concurrent.Flow provides interfaces that support the Reactive Streams publish-subscribe framework. These interfaces support interoperability across a number of asynchronous systems running on JVMs.

We can use utility class SubmissionPublisher to create custom components.

11. Unified JVM Logging

This feature introduces a common logging system for all components of the JVM. It provides the infrastructure to do the logging, but it does not add the actual logging calls from all JVM components. It also does not add logging to Java code in the JDK.

The logging framework defines a set of tags – for example, gc, compiler, threads, etc. We can use the command line parameter -Xlog to turn on logging during startup.

Let's log messages tagged with ‘gc' tag using ‘debug' level to a file called ‘gc.txt' with no decorations:

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

-Xlog:help will output possible options and examples. Logging configuration can be modified runtime using jcmd command. We are going to set GC logs to info and redirect them to a file – gc_logs:

jcmd 9615 VM.log output=gc_logs what=gc

12. New APIs

12.1. Immutable Set

java.util.Set.of() – creates an immutable set of a given elements. In Java 8 creating a Set of several elements would require several lines of code. Now we can do it as simple as:

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

The Set returned by this method is JVM internal class: java.util.ImmutableCollections.SetN, which extends public java.util.AbstractSet. It is immutable – if we try to add or remove elements, an UnsupportedOperationException will be thrown.

You can also convert an entire array into a Set with the same method.

12.2. Optional to Stream

java.util.Optional.stream() gives us an easy way to you use the power of Streams on Optional elements:

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

13. Conclusion

Java 9 akan hadir dengan JVM modular dan banyak peningkatan serta fitur baru dan beragam lainnya.

Anda dapat menemukan kode sumber untuk contoh di atas di GitHub.