JAVA9新特性

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我们大致来看一下一个例子(m odule-info.java)

[java]  view plain   copy
  print ?
  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,简单的来看一个代码片段

[java]  view plain   copy
  print ?
  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才能得到,但是在这一次的增强中,你将会很轻松的得到这样的信息,我们来看一个简单的例子

[java]  view plain   copy
  print ?
  1. ProcessHandle self = ProcessHandle.current();  
  2. long PID = self.getPid();  
  3. ProcessHandle.Info procInfo = self.info();  
  4.     
  5. Optional args = procInfo.arguments();  
  6. Optional cmd =  procInfo.commandLine();  
  7. Optional startTime = procInfo.startInstant();  
  8. Optional cpuUsage = procInfo.totalCpuDuration();  

上面有大量的Optional,这是Java 8中的API,同样在Java 9中对其进行了增强,本人在Java 8实战视频中对Optional API进行了源码级别的剖析,感兴趣的一定要去看看。

已经获取到了JVM的进程,我们该如何将该进程优雅的停掉呢?下面的代码给出了答案

[java]  view plain   copy
  print ?
  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 中会更加的方便这一特征

[java]  view plain   copy
  print ?
  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

[java]  view plain   copy
  print ?
  1. FooClass fc = new FooClass<>(1) { // anonymous inner class  
  2. };  
  3.     
  4. FooClassextends 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

[java]  view plain   copy
  print ?
  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,我们来看一下这个演示

[java]  view plain   copy
  print ?
  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这个控制台下运行,我们如何运行脚本文件呢?

[java]  view plain   copy
  print ?
  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,借助它你可以很好的看到类之间的依赖关系

[java]  view plain   copy
  print ?
  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,看一下下面的代码片段

[java]  view plain   copy
  print ?
  1. BufferedImage[] resolutionVariants = ....  
  2. MultiResolutionImage bmrImage  
  3.   = new BaseMultiResolutionImage(baseIndex, resolutionVariants);  
  4. Image testRVImage = bmrImage.getResolutionVariant(1616);  
  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指令即可,比如:

[java]  view plain   copy
  print ?
  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真的如出一辙。

[java]  view plain   copy
  print ?
  1. Set strKeySet = Set.of("key1""key2""key3");  


14.  Optional To Stream

对Option提供了stream功能,关于Optional的用法,我在我的教程中讲的非常详细,如果你还没有掌握,抓紧啊


[java]  view plain   copy
  print ?
  1. List filteredList = listOfOptionals.stream()  
  2.   .flatMap(Optional::stream)  
  3.   .collect(Collectors.toList());  

15. 其他

  1. 转载地址:http://blog.csdn.net/wangwenjun69/article/details/53572376

你可能感兴趣的:(java,java,技术)