Java 9 új funkciók

1. Áttekintés

A Java 9 gazdag funkciókészlettel rendelkezik. Bár nincsenek új nyelvi fogalmak, az új API-k és a diagnosztikai parancsok mindenképpen érdekesek lesznek a fejlesztők számára.

Ebben az írásban gyors, magas szintű áttekintést fogunk végezni néhány új funkcióval kapcsolatban; az új funkciók teljes listája itt érhető el.

2. Moduláris rendszer - Jigsaw Project

Kezdjük a nagyal - a modularitás bevezetésével a Java platformba.

A moduláris rendszer az OSGi keretrendszeréhez hasonló képességeket biztosít. A modulok rendelkeznek a függőségek fogalmával, exportálhatnak egy nyilvános API-t, és rejtve / titokban tarthatják a megvalósítás részleteit.

Az egyik fő motiváció itt a moduláris JVM biztosítása, amely sokkal kevesebb rendelkezésre álló memóriával rendelkező eszközökön futtatható. A JVM csak azokkal a modulokkal és API-kkal futtatható, amelyekre az alkalmazás szükséges. Nézze meg ezt a linket, hogy leírja ezeket a modulokat.

Ezenkívül a JVM belső (megvalósítás) API-k is com.sun. * az alkalmazáskódból már nem érhetők el.

Egyszerűen fogalmazva: a modulokat egy fájl nevű fájl írja le module-info.java a java-kód hierarchia tetején található:

modul com.baeldung.java9.modules.car {com_baeldung.java9.modules.engines szükséges; exportja com.baeldung.java9.modules.car.handling; } 

Modulunk autó modult igényel motor futtatni és exportálni egy csomagot kezelése.

Részletesebb példákért lásd: OpenJDK Project Jigsaw: Module System Quick-Start Guide.

3. Új HTTP kliens

A régiek régóta várt cseréje HttpURLConnection.

Az új API az. Alatt található java.net.http csomag.

Támogatnia kell mind a HTTP / 2 protokollt, mind a WebSocket kézfogást, teljesítményének összehasonlíthatónak kell lennie az Apache HttpClient, a Netty és a Jetty szolgáltatásokkal.

Vessen egy pillantást erre az új funkcióra egy egyszerű HTTP-kérelem létrehozásával és küldésével.

Frissítés: A HTTP kliens JEP az inkubátor modulba kerül, ezért már nem érhető el a csomagban java.net.http és ehelyett a jdk.inkubátor.http.

3.1. Gyors GET kérés

Az API a Builder mintát használja, ami nagyon egyszerűvé teszi a gyors felhasználást:

HttpRequest kérés = HttpRequest.newBuilder () .uri (új URI ("// postman-echo.com/get")) .GET () .build (); HttpResponse response = HttpClient.newHttpClient () .send (kérés, HttpResponse.BodyHandler.asString ()); 

4. Process API

A folyamat API-t továbbfejlesztettük az operációs rendszer folyamatainak vezérléséhez és kezeléséhez.

4.1. Folyamatinformációk

Osztály java.lang.ProcessHandle a legtöbb új funkciót tartalmazza:

ProcessHandle self = ProcessHandle.current (); hosszú PID = self.getPid (); ProcessHandle.Info procInfo = self.info (); Opcionális args = procInfo.arguments (); Opcionális cmd = procInfo.commandLine (); Opcionális startTime = procInfo.startInstant (); Opcionális cpuUsage = procInfo.totalCpuDuration ();

A jelenlegi metódus visszaadja egy objektumot, amely egy jelenleg futó JVM folyamatot képvisel. A Info alosztály részleteket ad a folyamatról.

4.2. Folyamatok megsemmisítése

Most - állítsuk le az összes futó gyermekfolyamat használatát elpusztítani():

childProc = ProcessHandle.current (). gyermekek (); childProc.forEach (procHandle -> {assertTrue ("Nem sikerült megölni a folyamatot" + procHandle.getPid (), procHandle.destroy ());});

5. Kis nyelvmódosítások

5.1. Próbálja ki az erőforrásokat

A Java 7-ben a erőforrásokkal próbálkozzon a szintaxishoz friss változót kell deklarálni az utasítás által kezelt minden erőforráshoz.

A Java 9-ben van egy további finomítás: ha az erőforrásra egy végső vagy ténylegesen végső változó hivatkozik, akkor egy try-with-resources utasítás kezelheti az erőforrást anélkül, hogy új változót deklarálnának:

MyAutoCloseable mac = new MyAutoCloseable (); try (mac) {// csináljon néhány dolgot mac-tal} try (new MyAutoCloseable () {} .finalWrapper.finalCloseable) {// csináljon néhány dolgot a finalCloseable} catch (Exception ex) {} 

5.2. Diamond Operator kiterjesztés

Most használhatjuk a gyémánt operátort anonim belső osztályokkal együtt:

FooClass fc = new FooClass (1) {// névtelen belső osztály}; FooClass fc0 = új FooClass (1) {// névtelen belső osztály}; FooClass fc1 = új FooClass (1) {// névtelen belső osztály}; 

5.3. Interfész privát módszer

A következő JVM-verzió interfészei lehetnek magán módszerek, amelyek felhasználhatók hosszadalmas alapértelmezett módszerek felosztására:

interfész InterfaceWithPrivateMethods {private static String staticPrivate () {return "static private"; } private String instancePrivate () {return "példány privát"; } alapértelmezett void check () {String eredmény = staticPrivate (); InterfaceWithPrivateMethods pvt = new InterfaceWithPrivateMethods () {// névtelen osztály}; eredmény = pvt.instancePrivate (); }}}

6. JShell parancssori eszköz

A JShell read – eval – print hurok - röviden a REPL szót.

Egyszerűen fogalmazva, ez egy interaktív eszköz a Java deklarációk, utasítások és kifejezések kiértékelésére, egy API-val együtt. Nagyon kényelmes kis kódrészletek teszteléséhez, amelyek egyébként új osztály létrehozását igénylik a fő- módszer.

A jshell maga a futtatható fájl található /kuka mappa:

jdk-9 \ bin> jshell.exe | Üdvözli a JShell - 9. verzió | Bevezetési típushoz: / help intro jshell> "Ez az én hosszú húrom. Szeretnék egy részét" .substring (8,19); $ 5 ==> "hosszú húrom"

Az interaktív shell előzményekkel és automatikus kiegészítéssel érkezik; emellett olyan funkciókat is nyújt, mint a fájlokba mentés és az abból történő betöltés, az összes vagy néhány írott utasítás:

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

A kódrészletek a fájl betöltésekor kerülnek végrehajtásra.

7. JCMD alparancsok

Fedezzük fel az új alparancsokat jcmd parancssori segédprogram. Megkapjuk a JVM-be töltött összes osztály és azok öröklési struktúrájának listáját.

Az alábbi példában láthatjuk a java.lang.Socket betöltve az Eclipse Neon futtató JVM-be:

jdk-9 \ bin> jcmd 14056 VM.class_hierarchy -i -s java.net.Socket 14056: java.lang.Object / null | --java.net.Socket / null | megvalósítja a java.io.Closeable / null (deklarált intf) | megvalósítja a java.lang.AutoCloseable / null (örökölt intf) | | --org.eclipse.ecf.internal.provider.filetransfer.httpclient4.CloseMonitoringSocket | | megvalósítja a java.lang.AutoCloseable / null (örökölt intf) | | megvalósítja a java.io.Closeable / null (örökölt intf) | | --javax.net.ssl.SSLSocket / null | | megvalósítja a java.lang.AutoCloseable / null (örökölt intf) | | megvalósítja a java.io.Closeable / null (örökölt intf) 

Az első paraméter a jcmd parancs a JVM folyamatazonosítója (PID), amelyen futtatni szeretnénk a parancsot.

Egy másik érdekes alparancs az set_vmflag. Néhány JVM-paramétert online módosíthatunk anélkül, hogy újra kellene indítanunk a JVM-folyamatot és módosítanánk annak indítási paramétereit.

Megtalálhatja az összes elérhető virtuális gép zászlót alparancssal jcmd 14056 VM.flags -minden

8. Мulti-Resolution Image API

Az interfész java.awt.image.MultiResolutionImage különféle felbontású képek halmazát egyetlen objektumba tömöríti. Beolvashatunk egy felbontás-specifikus képváltozatot egy adott DPI mutató és képtranszformációs halmaz alapján, vagy lekérhetjük a kép összes változatát.

A java.awt.Grafika osztály az aktuális megjelenített DPI mutató és az alkalmazott transzformációk alapján egy többfelbontású képből kap variánst.

Osztály java.awt.image.BaseMultiResolutionImage biztosítja az alapvető megvalósítást:

BufferedImage [] resolutionVariants = .... MultiResolutionImage bmrImage = új BaseMultiResolutionImage (baseIndex, resolutionVariants); Kép tesztRVImage = bmrImage.getResolutionVariant (16, 16); assertSame ("A képek azonosak legyenek", testRVImage, resolutionVariants [3]); 

9. Változtatható fogantyúk

Az API alatt található java.lang.invoke és abból áll VarHandle és MethodHandles. Ennek megfelelőit biztosítja java.util.concurrent.atomic és sun.misc.biztonságos műveletek objektum mezőkön és hasonló teljesítményű tömb elemeken.

Java 9 moduláris rendszereléréssel sun.misc.biztonságos alkalmazáskódból nem lesz lehetséges.

10. Publish-Subscribe Framework

Osztály java.util.concurrent.Flow olyan interfészeket biztosít, amelyek támogatják a Reactive Streams közzétételi-feliratkozási keretrendszert. Ezek az interfészek számos JVM-en futó aszinkron rendszeren támogatják az interoperabilitást.

Használhatunk hasznossági osztályt SubmissionPublisher egyedi összetevők létrehozásához.

11. Egységes JVM naplózás

Ez a szolgáltatás bevezet egy közös naplózási rendszert a JVM összes eleméhez. Ez biztosítja az infrastruktúrát a naplózáshoz, de nem adja hozzá a JVM összes összetevőjéből származó tényleges naplózási hívásokat. Ezenkívül a naplózást nem adja hozzá a JDK Java-kódjához.

A naplózási keret meghatározza a címkék - például, gc, fordítóprogram, szálakstb. Használhatjuk a parancssori paramétert -Xlog hogy az indításkor bekapcsolja a naplózást.

Jelöljük be a „gc” címkével ellátott üzeneteket a „debug” szintet használva a „gc.txt” nevű fájlba, dekoráció nélkül:

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

-Xlog: segítség lehetséges opciókat és példákat ad ki. A naplózási konfiguráció a futásidejű használatával módosítható jcmd parancs. A GC naplókat információra állítjuk és átirányítjuk egy fájlba - gc_logs:

jcmd 9615 VM.log output = gc_logs mit = gc

12. Új API-k

12.1. Változhatatlan készlet

java.util.Set.of () - létrehoz egy adott elemek megváltoztathatatlan halmazát. A Java 8 alkalmazásban több elemből álló készlet létrehozásához több kódsorra lenne szükség. Most megtehetjük olyan egyszerű módon, mint:

Set strKeySet = Set.of ("kulcs1", "kulcs2", "kulcs3");

A Készlet Ezzel a módszerrel a JVM belső osztálya tér vissza: java.util.ImmutableCollections.SetN, amely kiterjed a nyilvánosságra java.util.AbstractSet. Változhatatlan - ha elemeket próbálunk hozzáadni vagy eltávolítani, akkor egy UnsupportedOperationException dobni fogják.

Konvertálhat egy teljes tömböt a-ba is Készlet ugyanazzal a módszerrel.

12.2. Választható a Streamhez

java.util.Optional.stream () egyszerű módot kínál arra, hogy a Streamek lehetőségeit kihasználhassa az Opcionális elemekre:

List filteredList = listOfOptionals.stream () .flatMap (Opcionális :: stream) .collect (Collectors.toList ()); 

13. Következtetés

A Java 9 moduláris JVM-mel és sok más új és változatos fejlesztéssel és szolgáltatással fog érkezni.

A példák forráskódját a GitHubon találja meg.