Java 9 Nye funktioner

1. Oversigt

Java 9 leveres med et rigt funktionssæt. Selvom der ikke er nye sprogkoncepter, vil nye API'er og diagnostiske kommandoer helt sikkert være interessante for udviklere.

I denne opskrivning skal vi se hurtigt på højt niveau på nogle af de nye funktioner; en komplet liste over nye funktioner er tilgængelig her.

2. Modulært system - Jigsaw-projekt

Lad os starte med den store - bringe modularitet ind i Java-platformen.

Et modulært system giver funktioner svarende til OSGi framework's system. Moduler har et koncept for afhængigheder, kan eksportere en offentlig API og holde implementeringsoplysninger skjult / privat.

En af hovedmotiverne her er at levere modulær JVM, som kan køre på enheder med meget mindre tilgængelig hukommelse. JVM kunne kun køre med de moduler og API'er, der kræves af applikationen. Tjek dette link for en beskrivelse af, hvad disse moduler er.

Også JVM interne (implementerings) API'er som com.sun. * er ikke længere tilgængelige fra applikationskode.

Kort sagt, modulerne vil blive beskrevet i en fil kaldet modul-info.java placeret i toppen af ​​Java-kodehierarkiet:

modul com.baeldung.java9.modules.car {kræver com.baeldung.java9.modules.engines; eksporterer com.baeldung.java9.modules.car.handling; } 

Vores modul bil kræver modul motor at køre og eksportere en pakke til håndtering.

For mere detaljeret eksempel, tjek OpenJDK Project Jigsaw: Module System Quick-Start Guide.

3. En ny HTTP-klient

En længe ventet erstatning af det gamle HttpURLforbindelse.

Den nye API er placeret under java.net.http pakke.

Det skal understøtte både HTTP / 2-protokol og WebSocket-håndtryk med ydeevne, der skal kunne sammenlignes med Apache HttpClient, Netty og Jetty.

Lad os se på denne nye funktionalitet ved at oprette og sende en simpel HTTP-anmodning.

Opdatering: HTTP-klienten JEP flyttes til inkubator-modulet, så den er ikke længere tilgængelig i pakken java.net.http og er i stedet tilgængelig under jdk.inkubator.http.

3.1. Hurtig GET-anmodning

API'en bruger Builder-mønsteret, hvilket gør det virkelig nemt til hurtig brug:

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

4. Process API

Processen API er blevet forbedret til styring og styring af operativsystemprocesser.

4.1. Procesinformation

Klassen java.lang.ProcessHandle indeholder de fleste af de nye funktioner:

ProcessHandle self = ProcessHandle.current (); lang PID = self.getPid (); ProcessHandle.Info procInfo = self.info (); Valgfri args = procInfo.arguments (); Valgfri cmd = procInfo.commandLine (); Valgfri starttid = procInfo.startInstant (); Valgfri cpuUsage = procInfo.totalCpuDuration ();

Det nuværende metoden returnerer et objekt, der repræsenterer en proces, hvor JVM i øjeblikket kører. Det Info underklasse giver detaljer om processen.

4.2. Ødelægge processer

Lad os nu stoppe alle kørende underordnede processer ved hjælp af ødelægge():

childProc = ProcessHandle.current (). børn (); childProc.forEach (procHandle -> {assertTrue ("Kunne ikke dræbe processen" + procHandle.getPid (), procHandle.destroy ());});

5. Ændringer af små sprog

5.1. Prøv-med-ressourcer

I Java 7 er prøv med ressourcer syntaks kræver, at der erklæres en ny variabel for hver ressource, der administreres af udsagnet.

I Java 9 er der en yderligere raffinement: hvis der refereres til ressourcen ved en endelig eller effektiv endelig variabel, kan en prøve-med-ressource-erklæring administrere en ressource uden at en ny variabel erklæres:

MyAutoCloseable mac = ny MyAutoCloseable (); prøv (mac) {// gør nogle ting med mac} prøv (nye MyAutoCloseable () {} .finalWrapper.finalCloseable) {// gør nogle ting med finalCloseable} fangst (Undtagelse ex) {} 

5.2. Diamond Operator Extension

Nu kan vi bruge diamantoperatør i forbindelse med anonyme indre klasser:

FooClass fc = ny FooClass (1) {// anonym indre klasse}; FooClass fc0 = ny FooClass (1) {// anonym indre klasse}; FooClass fc1 = ny FooClass (1) {// anonym indre klasse}; 

5.3. Interface privat metode

Grænseflader i den kommende JVM-version kan have privat metoder, som kan bruges til at opdele lange standardmetoder:

interface InterfaceWithPrivateMethods {privat statisk streng staticPrivate () {returnerer "statisk privat"; } privat strenginstansPrivat () {returner "forekomst privat"; } standard ugyldig kontrol () {String result = staticPrivate (); InterfaceWithPrivateMethods pvt = ny InterfaceWithPrivateMethods () {// anonym klasse}; resultat = pvt.instancePrivate (); }}}

6. JShell kommandolinjeværktøj

JShell er read – eval – print loop - REPL for kort.

Kort sagt, det er et interaktivt værktøj til at evaluere erklæringer, udsagn og udtryk for Java sammen med en API. Det er meget praktisk at teste små kodestykker, som ellers kræver oprettelse af en ny klasse med vigtigste metode.

Det jshell selve eksekverbar kan findes i /beholder folder:

jdk-9 \ bin> jshell.exe | Velkommen til JShell - Version 9 | For en introduktionstype: / help intro jshell> "Dette er min lange streng. Jeg vil have en del af den". Substring (8,19); $ 5 ==> "min lange streng"

Den interaktive skal leveres med historie og automatisk udfyldelse; det giver også funktionalitet som at gemme til og indlæse fra filer, alle eller nogle af de skriftlige udsagn:

jshell> / gem c: \ udvikle \ JShell_hello_world.txt jshell> / åben c: \ udvikle \ JShell_hello_world.txt Hej JShell! 

Kodestykker udføres ved filindlæsning.

7. JCMD-underkommandoer

Lad os udforske nogle af de nye underkommandoer i jcmd kommandolinjeværktøj. Vi får en liste over alle klasser, der er indlæst i JVM og deres arvestruktur.

I eksemplet nedenfor kan vi se hierarkiet af java.lang.Socket indlæst i JVM, der kører Eclipse Neon:

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

Den første parameter for jcmd kommando er proces-id (PID) for JVM, som vi vil køre kommandoen på.

En anden interessant underkommando er sæt_vmflag. Vi kan ændre nogle JVM-parametre online uden behov for at genstarte JVM-processen og ændre dens startparametre.

Du kan finde ud af alle de tilgængelige VM-flag med underkommando jcmd 14056 VM.flags -all

8. Image-API med flere opløsninger

Grænsefladen java.awt.image.MultiResolutionImage indkapsler et sæt billeder med forskellige opløsninger i et enkelt objekt. Vi kan hente en opløsningsspecifik billedvariant baseret på en given DPI-metrisk og sæt billedtransformationer eller hente alle varianterne i billedet.

Det java.awt.Grafik klasse får variant fra et multiopløsningsbillede baseret på det aktuelle display DPI-metrisk og eventuelle anvendte transformationer.

Klassen java.awt.image.BaseMultiResolutionImage giver grundlæggende implementering:

BufferedImage [] resolutionVariants = .... MultiResolutionImage bmrImage = ny BaseMultiResolutionImage (baseIndex, resolutionVariants); Image testRVImage = bmrImage.getResolutionVariant (16, 16); assertSame ("Billeder skal være de samme", testRVImage, resolutionVariants [3]); 

9. Variable håndtag

API'en ligger under java.lang.invoke og består af VarHandle og Metode Håndtag. Det giver ækvivalenter af java.util.concurrent.atomic og sun.misc. usikker operationer på objektfelter og arrayelementer med lignende ydeevne.

Med Java 9 Modular systemadgang til sun.misc. usikker vil ikke være mulig fra applikationskode.

10. Publish-Subscribe Framework

Klassen java.util.concurrent.Flow leverer grænseflader, der understøtter Reactive Streams publish-subscribe-rammen. Disse grænseflader understøtter interoperabilitet på tværs af et antal asynkrone systemer, der kører på JVM'er.

Vi kan bruge hjælpeklasse IndsendelseUdgiver for at oprette brugerdefinerede komponenter.

11. Samlet JVM-logning

Denne funktion introducerer et fælles logningssystem til alle komponenter i JVM. Det giver infrastrukturen til at foretage logning, men det tilføjer ikke de faktiske logningskald fra alle JVM-komponenter. Det tilføjer heller ikke logning til Java-kode i JDK.

Logningsrammen definerer et sæt tags - for eksempel, gc, kompilator, trådeosv. Vi kan bruge kommandolinjeparameteren -Xlog for at slå logning til under opstart.

Lad os logge beskeder tagget med 'gc' tag ved hjælp af 'debug' niveau til en fil kaldet 'gc.txt' uden dekorationer:

java -Xlog: gc = debug: fil = gc.txt: ingen ...

-Xlog: hjælp vil sende mulige muligheder og eksempler. Logningskonfiguration kan ændres ved hjælp af jcmd kommando. Vi vil indstille GC-logfiler til info og omdirigere dem til en fil - gc_logs:

jcmd 9615 VM.log output = gc_logs hvad = gc

12. Nye API'er

12.1. Uforanderligt sæt

java.util.Set.of () - skaber et uforanderligt sæt af givne elementer. I Java 8 kræver oprettelse af et sæt af flere elementer flere linjer kode. Nu kan vi gøre det så simpelt som:

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

Det Sæt returneret ved denne metode er JVM intern klasse: java.util.ImmutableCollections.SetN, som udvider offentligheden java.util.AbstractSet. Det er uforanderligt - hvis vi forsøger at tilføje eller fjerne elementer, an Ikke-understøttetOperationException vil blive kastet.

Du kan også konvertere et helt array til et Sæt med samme metode.

12.2. Valgfrit at streame

java.util.Optional.stream () giver os en nem måde, hvorpå du kan bruge Streams til valgfri elementer:

Liste filtreretListe = listOfOptionals.stream () .flatMap (Valgfri :: stream) .collect (Collectors.toList ()); 

13. Konklusion

Java 9 kommer med en modulær JVM og mange andre nye og forskellige forbedringer og funktioner.

Du kan finde kildekoden til eksemplerne på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found