Java 9 新特性快速預覽

來源:互聯網
上載者:User

標籤:modules   ring   buffere   .so   work   tom   int   into   data   

原文出處:wangwenjun69

 

Java 8 已經出來三年多的時間了,原本計劃2016年七月份release Java 9,但是基於種種原因,Java 9 被延遲到了2017年的3月份,本人也在Open JDK的官網上看到了Java 10的標準也在制定當中,Java的發展真的越來越快了,在Java 9正式發布之前,我們可以使用它的SNAPSHOT版本,先來體驗一下Java 9 有哪些新的特性,下面的清單來自於官方文檔,看著似乎很多,但是真正具有顛覆意義的其實就是Module System,其餘很多主要是一些新的feature增加,還有一些功能的加強,在本篇文章中,我們將介紹一下主要的幾個,不會一一去說,資料也不多,所以我想說也沒的說,另外Java 8 是我認為迄今為止Java 最大的一次變化,不光是特性的增加,更多的是編程風格的轉變,如果你還沒有掌握Java 8,建議你看一下本人錄製的教學視頻,大致40集,專門是針對Java 8特性的實戰視頻,為:

https://pan.baidu.com/s/1nvCt83v

102: Process API Updates110: HTTP 2 Client143: Improve Contended Locking158: Unified JVM Logging165: Compiler Control193: Variable Handles197: Segmented Code Cache199: Smart Java Compilation, Phase Two200: The Modular JDK201: Modular Source Code211: Elide Deprecation Warnings on Import Statements212: Resolve Lint and Doclint Warnings213: Milling Project Coin214: Remove GC Combinations Deprecated in JDK 8215: Tiered Attribution for javac216: Process Import Statements Correctly217: Annotations Pipeline 2.0219: Datagram Transport Layer Security (DTLS)220: Modular Run-Time Images221: Simplified Doclet API222: jshell: The Java Shell (Read-Eval-Print Loop)223: New Version-String Scheme224: HTML5 Javadoc225: Javadoc Search226: UTF-8 Property Files227: Unicode 7.0228: Add More Diagnostic Commands229: Create PKCS12 Keystores by Default231: Remove Launch-Time JRE Version Selection232: Improve Secure Application Performance233: Generate Run-Time Compiler Tests Automatically235: Test Class-File Attributes Generated by javac236: Parser API for Nashorn237: Linux/AArch64 Port238: Multi-Release JAR Files240: Remove the JVM TI hprof Agent241: Remove the jhat Tool243: Java-Level JVM Compiler Interface244: TLS Application-Layer Protocol Negotiation Extension245: Validate JVM Command-Line Flag Arguments246: Leverage CPU Instructions for GHASH and RSA247: Compile for Older Platform Versions248: Make G1 the Default Garbage Collector249: OCSP Stapling for TLS250: Store Interned Strings in CDS Archives251: Multi-Resolution Images252: Use CLDR Locale Data by Default253: Prepare JavaFX UI Controls & CSS APIs for Modularization254: Compact Strings255: Merge Selected Xerces 2.11.0 Updates into JAXP256: BeanInfo Annotations257: Update JavaFX/Media to Newer Version of GStreamer258: HarfBuzz Font-Layout Engine259: Stack-Walking API260: Encapsulate Most Internal APIs261: Module System262: TIFF Image I/O263: HiDPI Graphics on Windows and Linux264: Platform Logging API and Service265: Marlin Graphics Renderer266: More Concurrency Updates267: Unicode 8.0268: XML Catalogs269: Convenience Factory Methods for Collections270: Reserved Stack Areas for Critical Sections271: Unified GC Logging272: Platform-Specific Desktop Features273: DRBG-Based SecureRandom Implementations274: Enhanced Method Handles275: Modular Java Application Packaging276: Dynamic Linking of Language-Defined Object Models277: Enhanced Deprecation278: Additional Tests for Humongous Objects in G1279: Improve Test-Failure Troubleshooting280: Indify String Concatenation281: HotSpot C++ Unit-Test Framework282: jlink: The Java Linker283: Enable GTK 3 on Linux284: New HotSpot Build System285: Spin-Wait Hints287: SHA-3 Hash Algorithms288: Disable SHA-1 Certificates289: Deprecate the Applet API290: Filter Incoming Serialization Data292: Implement Selected ECMAScript 6 Features in Nashorn294: Linux/s390x Port295: Ahead-of-Time Compilation
1. Modular System – Jigsaw Project

    該特性是Java 9 最大的一個特性,Java 9起初的代號就叫Jigsaw,最近被更改為Modularity,Modularity提供了類似於OSGI架構的功能,模組之間存在相互的依賴關係,可以匯出一個公用的API,並且隱藏實現的細節,Java提供該功能的主要的動機在於,減少記憶體的開銷,我們大家都知道,在JVM啟動的時候,至少會有30~60MB的記憶體載入,主要原因是JVM需要載入rt.jar,不管其中的類是否被classloader載入,第一步整個jar都會被JVM載入到記憶體當中去,模組化可以根據模組的需要載入程式運行需要的class,那麼JVM是如何知道需要載入那些class的呢?這就是在Java 9 中引入的一個新的檔案module.java我們大致來看一下一個例子(module-info.java)

  1 module com.baeldung.java9.modules.car {  2     requires com.baeldung.java9.modules.engines;  3     exports com.baeldung.java9.modules.car.handling;  4 }

關於更多Java 9 模組編程的內容請參考一本書:《Java 9 Modularity》 裡面講的比較詳細,介紹了當前Java對jar之間以來的管理是多麼的混亂,引入modularity之後的改變會是很明顯的差別。

2. A New Http Client

   就目前而言,JDK提供的Http訪問功能,幾乎都需要依賴於HttpURLConnection,但是這個類大家在寫代碼的時候很少使用,我們一般都會選擇Apache的Http Client,此次在Java 9的版本中引入了一個新的package:java.net.http,裡面提供了對Http訪問很好的支援,不僅支援Http1.1而且還支援HTTP2,以及WebSocket,據說效能可以超過Apache HttpClient,Netty,Jetty,簡單的來看一個程式碼片段

  1 URI httpURI = new URI("http://www.94jiankang.com");  2 HttpRequest request = HttpRequest.create(httpURI).GET();  3 HttpResponse response = request.response();  4 String responseBody = response.body(HttpResponse.asString());
3. Process API Enhance

在Java很早的版本中,提供了Process這樣的API可以獲得進程的一些資訊,包括runtime,甚至是用它來執行當前主機的一些命令,但是請大家思考一個問題,你如何獲得你當前Java運行程式的PID?很顯然通過Process是無法獲得的,需要藉助於JMX才能得到,但是在這一次的增強中,你將會很輕鬆的得到這樣的資訊,我們來看一個簡單的例子

  1 ProcessHandle self = ProcessHandle.current();  2 long PID = self.getPid();  3 ProcessHandle.Info procInfo = self.info();  4   5 Optional<String[]> args = procInfo.arguments();  6 Optional<String> cmd =  procInfo.commandLine();  7 Optional<Instant> startTime = procInfo.startInstant();  8 Optional<Duration> cpuUsage = procInfo.totalCpuDuration();

上面有大量的Optional,這是Java 8中的API,同樣在Java 9中對其進行了增強,本人在Java 8實戰視頻中對Optional API進行了源碼層級的剖析,感興趣的一定要去看看。

已經擷取到了JVM的進程,我們該如何將該進程優雅的停掉呢?下面的代碼給出了答案

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

通過上面的一小段代碼,我們也發現了Java 9對斷言機制同樣增加了一些增強,多說一些題外話,我們目前的系統中運行一個嚴重依賴於Hive beelineServer的程式,beeline server不是很穩定,經常出現卡頓,甚至假死,假死後也不回複的問題,這樣就導致我們的程式也會出現卡頓,如果營運人員不對其進行清理,系統運行幾個月之後會發現很多殭屍進程,於是增加一個擷取當前JVM PID的功能,然後判斷到超過給定的時間對其進行主動殺死,完全是程式內部的行為,但是擷取PID就必須藉助於JMX的動作,另外殺死它也必須藉助於作業系統的命令,諸如kill這樣的命令,顯得非常的麻煩,但是Java 9的方式明顯要優雅方便許多。

4. Try-With-Resources的改變

   我們都知道,Try-With-Resources是從JDK 7 中引入的一項重要特徵,只要介面繼承了Closable就可以使用Try-With-Resources,減少finally語句塊的編寫,在Java 9 中會更加的方便這一特徵

  1 MyAutoCloseable mac = new MyAutoCloseable();  2 try (mac) {  3     // do some stuff with mac    4 }  5   6 try (new MyAutoCloseable() { }.finalWrapper.finalCloseable) {  7    // do some stuff with finalCloseable    8 } catch (Exception ex) { }

我們的Closeable完全不用寫在try()中。

5. Diamond Operator Extension
  1 FooClass<Integer> fc = new FooClass<>(1) { // anonymous inner class    2 };  3   4 FooClass<? extends Integer> fc0 = new FooClass<>(1) {  5     // anonymous inner class    6 };  7   8 FooClass<?> fc1 = new FooClass<>(1) { // anonymous inner class    9 };
6. Interface Private Method
  1 interface InterfaceWithPrivateMethods {  2   3     private static String staticPrivate() {  4         return "static private";  5     }  6   7     private String instancePrivate() {  8         return "instance private";  9     } 10  11     default void check() { 12         String result = staticPrivate(); 13         InterfaceWithPrivateMethods pvt = new InterfaceWithPrivateMethods() { 14             // anonymous class   15         }; 16         result = pvt.instancePrivate(); 17     } 18 }}

該特性完全是為了Java 8中default方法和static方法服務的。

7. JShell Command Line Tool

在Java 8 出來的時候,很多人都喊著,這是要搶奪Scala等基於JVM動態語言的市場啊,其中有人給出了一個Java做不到的方向,那就是Scala可以當作指令碼語言,Java可以嗎?很明顯在此之前Java不行,ta也不具備動態性,但是此次Java 9 卻讓Java也可以像指令碼語言一樣來運行了,主要得益於JShell,我們來看一下這個示範

  1 jdk-9\bin>jshell.exe  2 |  Welcome to JShell -- Version 9  3 |  For an introduction type: /help intro  4 jshell> "This is my long string. I want a part of it".substring(8,19);  5 $5 ==> "my long string"

這是我們在Jshell這個控制台下運行,我們如何運行指令檔呢?

  1 jshell> /save c:\develop\JShell_hello_world.txt  2 jshell> /open c:\develop\JShell_hello_world.txt  3 Hello JShell!
8.JCMD Sub-Commands

記得在Java 8中,放棄了Jhat這個命令,但是很快在Java 9中增加了一些新的命令,比如我們要介紹到的jcmd,藉助它你可以很好的看到類之間的依賴關係

  1 jdk-9\bin>jcmd 14056 VM.class_hierarchy -i -s java.net.Socket  2 14056:  3 java.lang.Object/null  4 |--java.net.Socket/null  5 |  implements java.io.Closeable/null (declared intf)  6 |  implements java.lang.AutoCloseable/null (inherited intf)  7 |  |--org.eclipse.ecf.internal.provider.filetransfer.httpclient4.CloseMonitoringSocket  8 |  |  implements java.lang.AutoCloseable/null (inherited intf)  9 |  |  implements java.io.Closeable/null (inherited intf) 10 |  |--javax.net.ssl.SSLSocket/null 11 |  |  implements java.lang.AutoCloseable/null (inherited intf) 12 |  |  implements java.io.Closeable/null (inherited intf)
9.Мulti-Resolution Image API

介面java.awt.image.MultiResolutionImage封裝了一系列的不同解析度映像到一個單獨對象的API,我麼可以根據給定的DPI 矩陣擷取resolution-specific,看一下下面的程式碼片段

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

關於AWT的東西,本人幾乎不怎麼接觸,如果有用到的朋友,等JDK 9出來之後,自己體會使用一下吧。

10. Variable Handles

很早之前就傳言Java 會將unsafe這一個類屏蔽掉,不給大家使用,這次看他的官方文檔,貌似所有已sun開頭的包都將不能在application中使用,但是java 9 提供了新的API供大家使用。

在JDK 9中提供了一個新的包,叫做java.lang.invoke裡面有一系列很重要的類比如VarHandler和MethodHandles,提供了類似於原子操作以及Unsafe操作的功能。

11.Publish-Subscribe Framework

在新版的JDK 9 中提供了訊息發布訂閱的架構,該架構主要是由Flow這個類提供的,他同樣會在java.util.concurrent中出現,並且提供了Reactive編程模式。

12. Unified JVM Logging

該特性為JVM的所有組件引入了一個通用的日誌系統,提供了JVM日誌的基礎設施,你可以不用專門為了列印某些日誌而添加一些專門的標籤,只需要使用統一的log指令即可,比如:

  1 java -Xlog:gc=debug:file=gc.txt:none ...  2 jcmd 9615 VM.log output=gc_logs what=gc
13. Immutable Set

其實在Java的早期版本中就已經有這樣的功能了,比如Collections.xxx就可以將某個collection封裝成不可變,但是此次的Java 9版本將其加到了對應的Set和List中,並且有一個專門的新包用來存放這些具體的實現java.util.ImmutableCollections,這一個特性和Scala真的如出一轍。

  1 Set<String> strKeySet = Set.of("key1", "key2", "key3");
14.  Optional To Stream

對Option提供了stream功能,關於Optional的用法,我在我的教程中講的非常詳細,如果你還沒有掌握,抓緊啊

  1 List<String> filteredList = listOfOptionals.stream()  2   .flatMap(Optional::stream)  3   .collect(Collectors.toList()); 
15. 其他
    1. 大致的特性我就介紹這麼多,你也可以到openJDK官網下載snapshot版本的java 9 來玩一下,當然還有其他很多功能我就不一一介紹了,這裡只是大概的提一下
    2. 輕量級的json文本處理api
    3. 移除很多已經被到期的GCC回收器(是移除哦,因為在Jdk 8 中只是加了到期的標記)
    4. 使用G1記憶體回收行程作為預設的記憶體回收行程
    5. HTML5風格的java doc
    6. java doc只是智能搜尋功能
    7. javascript的引擎得到了進一步的升級
    8. 引入了SHA-3的hash演算法
    9. 大神Doug Lea繼續為了這個版本的JDK服務,並且還會驚豔到大家。

Java 9 新特性快速預覽

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.