1. Gambaran keseluruhan
Java 9 dilengkapi dengan set ciri kaya. Walaupun tidak ada konsep bahasa baru, API baru dan arahan diagnostik pasti menarik bagi pembangun.
Dalam penulisan ini kita akan melihat beberapa ciri baru yang cepat dan tinggi; senarai penuh ciri baru boleh didapati di sini.
2. Sistem Modular - Projek Jigsaw
Mari kita mulakan dengan yang besar - membawa modulariti ke platform Java.
Sistem modular memberikan keupayaan yang serupa dengan sistem kerangka OSGi. Modul mempunyai konsep ketergantungan, dapat mengeksport API awam dan merahsiakan perincian pelaksanaan.
Salah satu motivasi utama di sini adalah menyediakan JVM modular, yang dapat dijalankan pada peranti dengan memori yang jauh lebih sedikit. JVM dapat dijalankan hanya dengan modul dan API yang diperlukan oleh aplikasi. Lihat pautan ini untuk keterangan mengenai modul-modul ini.
Juga, API dalaman (implementasi) JVM seperti com.sun. * Tidak lagi dapat diakses dari kod aplikasi.
Ringkasnya, modul akan dijelaskan dalam fail bernama module-info.java yang terletak di bahagian atas hierarki kod java:
module com.baeldung.java9.modules.car { requires com.baeldung.java9.modules.engines; exports com.baeldung.java9.modules.car.handling; }
Kereta modul kami memerlukan mesin modul untuk berjalan dan mengeksport pakej untuk dikendalikan .
Untuk contoh yang lebih mendalam periksa OpenJDK Project Jigsaw: Panduan Modul Sistem Pantas Sistem Modul.
3. Pelanggan HTTP Baru
A penggantian lama ditunggu-tunggu lama HttpURLConnection .
API baru terletak di bawah pakej java.net.http .
Ia harus menyokong protokol HTTP / 2 dan jabat tangan WebSocket, dengan prestasi yang harus setanding dengan Apache HttpClient, Netty dan Jetty.
Mari lihat fungsi baru ini dengan membuat dan mengirim permintaan HTTP sederhana.
Kemas kini: HTTP Pelanggan HTTP dipindahkan ke modul Inkubator, jadi ia tidak lagi tersedia dalam pakej java.net.http dan sebaliknya tersedia di bawah jdk.incubator.http.
3.1. Permintaan DAPATKAN Pantas
API menggunakan corak Pembina, yang menjadikannya sangat mudah untuk penggunaan cepat:
HttpRequest request = HttpRequest.newBuilder() .uri(new URI("//postman-echo.com/get")) .GET() .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandler.asString());
4. Proses API
API proses telah diperbaiki untuk mengawal dan mengurus proses sistem operasi.
4.1. Maklumat Proses
Kelas java.lang.ProcessHandle mengandungi sebahagian besar fungsi 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();
Yang semasa kaedah mengembalikan objek yang mewakili satu proses sedang berjalan JVM. The Maklumat subkelas menyediakan butiran mengenai proses.
4.2. Memusnahkan Proses
Now - mari kita menghentikan semua proses kanak-kanak berjalan menggunakan memusnahkan () :
childProc = ProcessHandle.current().children(); childProc.forEach(procHandle -> { assertTrue("Could not kill process " + procHandle.getPid(), procHandle.destroy()); });
5. Pengubahsuaian Bahasa Kecil
5.1. Cuba-Dengan-Sumber
Di Java 7, sintaks cuba-dengan-sumber memerlukan pemboleh ubah baru untuk diisytiharkan untuk setiap sumber yang dikendalikan oleh pernyataan.
Di Java 9 ada penyempurnaan tambahan: jika sumber tersebut dirujuk oleh pemboleh ubah akhir atau akhir, pernyataan cubaan dengan sumber dapat menguruskan sumber tanpa pemboleh ubah baru dinyatakan:
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. Sambungan Operator Berlian
Sekarang kita boleh menggunakan operator berlian bersama dengan kelas dalaman tanpa nama:
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. Kaedah Persendirian Antara Muka
Antaramuka dalam versi JVM yang akan datang boleh mempunyai kaedah peribadi , yang boleh digunakan untuk membagi kaedah lalai 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 Garis Perintah JShell
JShell dibaca - eval - print loop - REPL untuk pendek.
Ringkasnya, ini adalah alat interaktif untuk menilai pernyataan, pernyataan, dan ungkapan Java, bersama dengan API. Sangat mudah untuk menguji coretan kod kecil, yang sebaliknya memerlukan membuat kelas baru dengan kaedah utama .
The jshell laku sendiri boleh didapati 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"
The interactive shell comes with history and auto-completion; it also provides functionality like saving to and loading from files, all or some of the written statements:
jshell> /save c:\develop\JShell_hello_world.txt jshell> /open c:\develop\JShell_hello_world.txt Hello JShell!
Code snippets are executed upon file loading.
7. JCMD Sub-Commands
Let's explore some of the new subcommands in jcmd command line utility. We will get a list of all classes loaded in the JVM and their inheritance structure.
In the example below we can see the hierarchy of java.lang.Socket loaded in JVM running 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)
The first parameter of jcmd command is the process id (PID) of the JVM on which we want to run the command.
Another interesting subcommand is set_vmflag. We can modify some JVM parameters online, without the need of restarting the JVM process and modifying its startup parameters.
You can find out all the available VM flags with subcommand jcmd 14056 VM.flags -all
8. Мulti-Resolution Image API
The interface java.awt.image.MultiResolutionImage encapsulates a set of images with different resolutions into a single object. We can retrieve a resolution-specific image variant based on a given DPI metric and set of image transformations or retrieve all of the variants in the image.
The java.awt.Graphics class gets variant from a multi-resolution image based on the current display DPI metric and any applied transformations.
The class java.awt.image.BaseMultiResolutionImage provides basic implementation:
BufferedImage[] resolutionVariants = .... MultiResolutionImage bmrImage = new BaseMultiResolutionImage(baseIndex, resolutionVariants); Image testRVImage = bmrImage.getResolutionVariant(16, 16); assertSame("Images should be the same", testRVImage, resolutionVariants[3]);
9. Variable Handles
The API resides under java.lang.invoke and consists of VarHandle and MethodHandles. It provides equivalents of java.util.concurrent.atomic and sun.misc.Unsafe operations upon object fields and array elements with similar performance.
With Java 9 Modular system access to sun.misc.Unsafe will not be possible from application code.
10. Publish-Subscribe Framework
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 dilengkapi dengan JVM modular dan banyak penambahbaikan dan ciri baru dan pelbagai yang lain.
Anda boleh mendapatkan kod sumber untuk contoh di GitHub.