Java9 新特性 (一)新增特性

一、JDK9 的发布

  经过4次跳票,历经曲折的Java 9 终于终于在2017921日发布。

  从Java 9 这个版本开始, Java 的计划发布周期是 6 个月,下一个 Java 的主版本将于 2018 3 月发布,命名为 Java 18.3,紧接着再过六个月将发布 Java 18.9

  这意味着Java的更新从传统的以特性驱动的发布周期,转变为以时间驱动的(6 个月为周期)发布模式,并逐步的将 Oracle JDK 原商业特性进行开源。

  针对企业客户的需求, Oracle 将以三年为周期发布长期支持版本(long term support) 。

  Java 9 提供了超过150项新功能特性,包括备受期待的模块化系统、可交互的 REPL 工具: jshellJDK 编译工具, Java 公共 API 和私有代码,以及安全增强、扩展提升、性能管理改善等。可以Java 9是一个庞大的系统工程,完全做了一个整体改变

二、Java9 中的新特性

    

  官方提供的新特性列表:https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUIDC23AFD78-C777-460B-8ACE-58BE5EA681F6

  Open JDK:http://openjdk.java.net/projects/jdk9/

  Oracle JDK9 Documentation:https://docs.oracle.com/javase/9/

三、JDK和JRE目录结构的改变

  1、JDK8 的目录结构

    

  2、JDK9 及以后的目录结构

    

四、模块化系统:Jigsaw → Modularity

  1、Java 和相关生态暴露出的问题

    众所周知,Java 已经发展超过20年(95年最初发布),Java 运行环境的膨胀和臃肿每次JVM启动的时候,至少会有3060MB的内存加载,主要原因是JVM需要加载rt.jar,不管其中的类是否被classloader加载,第一步整个jar都会被JVM加载到内存当中去(而模块化可以根据模块的需要加载程序运行需要的class

    当代码库越来越大,创建复杂,盘根错节的意大利面条式代码的几率呈指数级的增长不同版本的类库交叉依赖导致让人头疼的问题,这些都阻碍了 Java 开发和运行效率的提升。

    很难真正地对代码进行封装, 而系统并没有对不同部分(也就是 JAR 文件)之间的依赖关系有个明确的概念。 每一个公共类都可以被类路径之下任何其它的公共类所访问到,这样就会导致无意中使用了并不想被公开访问的 API

  2、模块化系统:Jigsaw -> Modularity

    本质上讲也就是说, 用模块来管理各个package,通过声明某个package暴露, 模块(module)的概念,其实就是package外再裹一层不声明默认就是隐藏。因此,模块化使得代码组织上更安全因为它可以指定哪些部分可以暴露,哪些部分隐藏

    实现目标:

      模块化的主要目的在于减少内存的开销;
      只须必要模块,而非全部jdk模块,可简化各种类库和大型应用的开发和维护;
      改进 Java SE 平台,使其可以适应不同大小的计算设备;
      改进其安全性,可维护性,提高性能;

  3、案例

    模块将由通常的类和新的模块声明文件(module-info.java) 组成。 该文件是位于java代码结构的顶层, 该模块描述符明确地定义了我们的模块需要什么依赖关系以及哪些模块被外部使用。 在exports子句中未提及的所有包默认情况下将封装在模块中, 不能在外部使用。

      

  要想在java9demo模块中调用java9test模块下包中的结构, 需要在java9test module-info.java中声明:

   

   exports:控制着哪些包可以被其它模块访问到。 所有不被导出的包默认都被封装在模块里面。

   对应在java 9demo 模块的src 下创建module-info.java文件:

  

   requires:指明对其它模块的依赖。

五、Java 的REPL工具:JShell 命令

  1、产生背景

    像Python Scala 之类的语言早就有交互式编程环境 REPL (read - evaluate - print - loop), 以交互式的方式对语句和表达式进行求值。 开发者只需要输入一些代码,就可以在编译前获得对程序的反馈。 而之前的Java版本要想执行代码, 必须创建文件、 声明类、 提供测试方法方可实现

  2、设计理念

    即写即得、快速运行

  3、实现目标

    (1)Java 9 中终于拥有了 REPL工具: jShell。 让Java可以像脚本语言一样运行,从控制台启动jShell, 利用jShell在没有创建类的情况下直接声明变量,计算表达式,执行语句。即开发时可以在命令行里直接运行Java的代码,而无需创建Java文件,无需跟人解释” public static void main(String[] args)”这句废话;

    (2)jShell也可以从文件中加载语句或者将语句保存到文件中;

    (3)jShell也可以是tab键进行自动补全和自动添加分号;

  4、使用 jShell

    (1)调出 JShell

      

    (2)获取帮助

      

    (3)基本使用

      

         

    (4)导入指定的包

      

      默认已经导入如下的所有包: (包含java.lang)

      

    (5)自动补全

      只需按下 Tab 键,就能自动补全代码:

      

       (6)列出当前 session 里所有有效的代码片段

      

    (7)查看当前 session 下所有创建过的变量

      

    (8)查看当前 session 下所有创建过的方法

      

       Tips:我们还可以重新定义相同方法名和参数列表的方法,即为对现有方法的修改(或覆盖)。

    (9)使用外部代码编辑器来编写 Java 代码

      

    (10)使用/open命令调用

      

    (11)没有受检异常(编译时异常)

      

       说明:本来应该强迫我们捕获一个 IOException,但却没有出现。因为在 jShell 在后台为我们隐藏了。

    (12)退出 jShell

      

    Tips:在 JShell 环境下,语句末尾的“;” 是可选的。但推荐还是最好加上,提高代码可读性。

原文地址:https://www.cnblogs.com/niujifei/p/15068333.html