Java 9新特性
2019-04-19 14:35:46 0 举报
AI智能生成
Java9新特性小结
作者其他创作
大纲/内容
模块化系统Jigsaw
目标
使用模块(module)来清楚的描述组件之间的依赖关系,而不是jar;<br>使用新的module-path来解决类路径(classpath)管理的不足。<br>
提供了更强大的代码封装性:<br>在Java 9 中,模块之间的关系被称为“可读性”(readability),实际代码中一个类型对于另外一个类型的调用被称为“可访问性“(accessablity),即private、默认、protected、public访问修饰符。<br><b>可访问性的前提是可读性。因此public访问修饰符不再意味着具有可访问性了</b>。
模块声明:增加一个module-info.java文件描述模块信息。<br>模块声明中可以包含零个或多个模块语句。包括以下五种类型:<br>1、(模块)导出语句(exports statement)<br>2、(模块)打开语句(opens statement)<br>3、(模块)导入语句(requires statement)<br>4、(服务)使用语句(uses statement)<br>5、(服务)提供语句(provides statement)<br>
<h4 id="模块的访问控制"><b>1、模块访问控制<br></b>exports 和 opens 语句用于控制外部对模块代码的访问,其表达形式如下:<br></h4><i>exports <package>;<br>exports <package> to <module1>, <module2>...;<br>opens <package>;<br>opens <package> to <module1>, <module2>...;<br></i>exports 语句允许仅在编译时和运行时访问指定包的公共API;<br>而 opens 语句允许在运行时使用反射访问指定包中的所有类型的公共和私有成员
<b>2、声明模块间依赖关系</b><br>requires 语句用于声明模块对另一个模块的依赖关系,其表达形式如下:<br><i>requires <module>;<br>requires transitive <module>;<br>requires static <module>;<br>requires transitive static <module>;</i><br>其中的<i> static </i>修饰符表示在编译时的依赖是强制的,但在运行时是可选的;<br><i>transitive</i> 修饰符会导致依赖于当前模块的其他模块具有隐式依赖性(传递依赖)。<br>
<b>3、服务配置</b><br>uses 和 provides 语句分别用于表达服务消费和服务提供(用于SPI,即 Service Provider Interface 机制),其表达形式如下:<br><i>uses <service-interface>;<br>provides <service-interface> <br> with <service-impl-class1>, <service-impl-class2>...;</i>
如 <br>module test { <br> exports com.example.test; <br> requires main;<br> }
语法
增强@Deprecated注解
1、增加since版本标识属性<br>2、增加forRemoval属性,表示是否会在未来版本移除,默认为false
如@Deprecated(since = "1.1", forRemoval = true)
接口的 private 方法
在 Java 8 接口中增加 default 与 static 方法的基础上又增加了 private 方法
特殊标识符增加限制
Java 8 及之前版本中 String __ = "hello"; 这样的标识符是合法的,但是 Java 9 开始就用不了了。
改进 try-with-resources
无需在 try-with-resources 语句中声明一个新变量,直接使用即可;如果有多个变量,则用分号隔开
如:<br>InputStreamReader reader = new InputStreamReader(System.in);<br> OutputStreamWriter writer = new OutputStreamWriter(System.out);<br> try (reader ; writer) {<br> writer.write(reader.read());<br> } catch (Exception e) {<br> e.printStackTrace();<br> }<br>
钻石操作符<>的升级
支持匿名内部类,如 new HashMap<>() {}
类库
引入HttpClient API
jdk.incubator.httpclient 的孵化器模块,将会在以后的发布版本中用来替换旧的HttpURLConnection API。<br>其中不仅包含旧的 HttpURLConnection API 功能,另外还加入了对 HTTP/2 和 WebSocket 的支持。<br>
新增集合工厂方法
如List.of()、Set.of()、Map.of()方法创建<b>不可变集合</b>,也使集合初始化代码更简洁
改进 Optional 类
为 java.util.Optional 添加了很多新的有用方法,Optional 可以直接转为 Stream
反应式流 ( Reactive Streams )
java.util.concurrent.Flow 类,其中包含了 Flow.Publisher<T>、Flow.Subscriber<T>、Flow.Subscription 和 F<br> low.Processor<T, R> 4 个核心接口
实质是将Reactive Streams规范定义的4个接口引入,改了下包名
进程API
新增 java.lang.ProcessHandle 接口,用于对原生进程进行管理
平台日志API<br>
新增 java.lang.System.Logger 接口,其默认实现是 java.util.logging相关API
变量句柄 API
新增 java.lang.invoke.VarHandle 类,以作为 java.util.cocurrent.automic 包 和 sun.misc.Unsafe 类某些功能的替代方案。<br>
改进的 Stream API
新增takeWhile(动态确定何时终止迭代)、dropWhile(跳过满足给定条件前的值)、ofNullable、iterate(新重载方法)方法
轻量级的 JSON API
内置了一个轻量级的JSON API
多分辨率图像 API
定义多分辨率图像API,开发者可以很容易的操作和展示不同分辨率的图像了
改进进程控制相关API
ProcessHandle类还可以监视进程的活跃性并破坏进程。CompletableFuture 类的异步机制可以在 ProcessHandle.onExit 方法退出时执行操作
增加堆栈遍历 API
提供堆栈遍历API,允许轻松过滤和延迟访问堆栈跟踪中的信息。见 java.lang.StackWalker 类
String底层存储结构的变更
由原来的 char 数组变成 byte 数组,目的是为了更节省存储空间,提高性能。<br>同样地,StringBuilder 和 StringBuffer 底层也进行了改变,具体见 java.lang.AbstractStringBuilder 源码。
<b>原理:<br>基于ISO/latin1/Utf-16编码,latin1和ISO用一个byte标识,UTF-16用两个byte标识。<br>Java 9会自动识别用哪个编码,当数据用到1byte,就会使用iSO或者latin1编码,当空间数据满足2byte的时候,自动使用utf-16编码,节省了很多空间。</b>
工具
jshell
Java语言的REPL,交互式命令行工具,并提供了相关API
1、简化简单程序的编写与运行,便于快速验证代码正确性。<br>比如 <i>System.out.println("Hello World")</i> 仅仅一行代码就可以实现Hello World的输出<br>
2、可执行单个jshell脚本文件。将待执行的程序代码写到以.jsh为后缀名的文件中,使用jshell [filename]命令执行<br>
jlink
它是将 module 进行打包的工具,帮助目标机器的部署。打包后的文件将非常精简。
多版本兼容jar
用于解决jar包版本冲突及兼容问题
JVM调优增强功能
统一JVM日志记录
使用G1作为默认的垃圾收集器,弃用CMS垃圾收集器
改进的Javadoc
1、Java 9中的Javadoc 支持在 API 文档中的进行搜索;<br>2、输出的Javadoc文档兼容 HTML5 标准;<br>3、每个 Javadoc 页面都包含有关 JDK 模块类或接口来源的信息。
国际化功能
properties文件默认以UTF-8编码加载,Java 9以前是ISO-8859-1
0 条评论
下一页