java9 揭秘 jlink_初试Java9

原标题:初试Java9

Java 9 正式发布了

JDK 9

(http://openjdk.java.net/projects/jdk9/)

有不少重要或是有意思的新特性,这里简单介绍下我的了解与尝试

抛砖引玉

下载

oracle 官网下载即可。

(http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html)

安装配置好之后, java -version 查看一下, 会看到

ae552ecc5b9f021690f955bae180a914.png

这里正有一个新特性[223], 新的版本字符串格式$MAJOR.$MINOR.$SECURITY.$PATCH.

值得一提的是,Java 9 以后,新的功能版本将每六个月更新一次, 每三年发布一次长期支持. 此外,下个版本并不是 Java 10,而是Java 18.3,将于2018年3月推出。

新特性

04587ee7b3b05f423845301f39c772e6.png

jigsaw 模块化

可以说Java 9 最重要,也是受到最多关注的功能就是模块化了。模块化经历了多次跳票,带来的改变也是巨大的。

首先,模块化是一种将程序实现为多个独立模块的方式,有助于降低系统的复杂性以及低耦合。

为什么需要模块化呢,jigsaw 的项目描述里写的很清晰:

使开发人员更容易构建和维护库和大型应用

提高安全性,可维护性

提高性能

可轻量级部署,以用于小型计算设备和密集云部署

相关介绍我们结合对应的JEP来看:

[261] 模块系统

实现了Java平台模块系统,以及相关JDK的特定更改和增强。

[200] 模块化JDK

Java9将JDK也分为一堆模块,可以在编译, 构建及运行时按照各种配置来组合。包括并不限于:

- 完整的JAVA SE平台,完整的JRE及JDK 的配置;

- 与在Java SE 8中定义过的"紧凑型配置"(Compact Profiles) 在内容上基本一致的配置;

- 或者是 仅包含 应用模块, 外部库 以及它们所需要模块的自定义配置。

JDK 自身的模块化,使得用户可以根据需要选择模块。小型设备上可以不必要运行完整的JDK,简单的应用不再必须加载几十兆的 rt.jar, 后端应用也可以舍去并用不到的 Swing 等UI模块, 这使JAVA可以不那么臃肿。

[201] 模块化源代码

将JDK源代码重组为模块, 增强构建系统以编译模块

[220] 模块化运行时镜像(Run-Time Images)

重组JDK和JRE运行时镜像以适应模块,并提高性能, 安全性以及可维护性。定义新的URI方案,用于命名存储在运行时镜像中的模块,类和资源,而不会透露镜像的内部结构或格式。并根据需要修改现有规范以适应这些变化。

[260] 封装大多数内部API

默认封装JDK大部分内部API,使其在编译时无法访问。并为后面的发行版做准备,使其在运行时也无法访问。同时确保关键的,被广泛使用的内部API不被封装,以便它们仍可用,直到大部分功能都能被替换为止。

这就涉及模块化的另一个特点了, 强封装。

[275] 模块化Java应用程序打包

[282] jlink

在编译和运行之间 引入了一个新的可选阶段-链接,可以用 jlink 将一堆模块及其依赖项组合并优化到自定义运行时镜像中。

举个例子,假如我们写了一个简单的 helloWorld 的程序,只用到了 java.base 模块。 就可以指定模块打包:

4ed8ffc3ae3c496ec83b20b89b024d02.png

output 里会得到一个完整可用的仅包含 java.base, 也就是基础模块的jre。同样,我们也可以将自己的模块一起打包。具体例子稍后给出。

Java 9 模块之间的依赖关系图

963d6c2124329e54d5cff836d6d834e6.png

Java9 中,我们是通过 module-info.java 来定义并管理模块,指定模块之间的依赖关系的。默认包含基础模块 java.base。 这里举例 java.sql 模块的 module-info.java文件:

251a7d3e7420996cf8802bddb1ab7fc9.png

很容易看到这里和依赖关系图里是一致的,java.sql 直接依赖了 java.xml 与 java.logging 两个模块。

在该 module-info.java 文件中, module 后面的 "java.sql" 即定义的当前模块名。

requires ; 表示当前模块A 依赖于另一个模块B 。 transitive 修饰符表示, 如果有模块依赖于A,则隐含地依赖B。

exports ; 表示当前模块A 导出指定的 P包。 需要用到的模块C 只需要 require A即可。也可以使用 (exports to ;) 来指定导出模块,这样的话对于C 以外的模块来说,P 是不可见的。

可以看出,requires 是模块级别, exports 则具体到包。编写模块的人可以很细致的管理以及限定真正想要导出的内容。[260]里提到的正是这种情况, 像 sun.*, .internal. 等并不提倡使用, 就可以将这种API 指定只导出到用到的基础模块。

此外, 还支持服务提供者与使用者分离的机制。

uses ;

provides with , ...;

provides 提供服务接口的一个或多个实现类。 uses 指定服务接口, 然后当前模块就可以使用 ServiceLoader 类进行加载。

参考官方文档给出模块化的一个简单示例。

首先代码很简单,这里共4个文件, 两个模块, org.astro 与 com.greetings.

346f5e3395c5bbe2867314cdd0a096aa.png

然后编译及打包。

4f9dc8d8203e1e35904a2a48ef7df5dc.png

注: -p 同 --module-path, 是模块路径, 可以是包含模块的一个或多个目录。 -m 选项指定主模块,斜杠之后的值是模块中主类名。

jshell [222]

这是一个相当受欢迎的新功能。命令行直接输入 jshell 就可以开始使用,可以作为随手运行各种小代码的工具, 非常方便。

tab 可以自动补全,可以忽略句尾分号。输入 /exit 或Ctrl+D 即可退出。

2766910890ebc6f138d6079e219ab97c.png

HTTP/2 Client [110]

定义了新的HTTP client API,支持 HTTP/2及WebSocket,可以替换掉原有的HttpURLConnection。 不过相关的 API 放在了 jdk.incubator.http 下,而不在默认模块里,也就是使用时需要在 module-info 里加上 requires jdk.incubator.httpclient;

5469b599c47993fda3a0c247ed305c1d.png

Milling Project Coin [213] 一些小变化

@SafeArgs 注解之前只能用于static及final方法,现在也可用于私有实例方法。

try-with-resources 之前资源的声明语句放在 try 关键字的括号里面,现在支持 effectively-final 变量。

409fa0b8e0c31de24f1fe1b3058d6f97.png

只要编译器能推断出类型参数, 匿名类允许使用<>

c48878bb956571b3cff0b890035345e2.png

下划线 _ 不能单独用做标识符。

interface 之前已经支持添加默认方法, 现在支持私有方法。

5e0b38eb61afa5d384b5931be4b47166.png

紧凑型字符串 [254]

String 采取更加节省空间的内部表示,提高了空间效率,同时保持大多数情况下的性能,并完全兼容原有接口。

从 char[] 改为使用byte[],直接存放编码。在构造时设置 LATIN1 或者 UTF16。省内存!

7d587bff1e7f3127425a68fd6d52dc51.png

集合工厂方法[269]

Map/Set/List接口添加了简单初始化不可变集合的工厂方法, 可以直接写作如 List.of(1, 2, 3),不再需要挨个元素来 add 了。返回的是 java.util.ImmutableCollections 下定义的嵌套类型的实例, 注意,是不可变的集合。

a399d255cd2bc0996c197b0a751b8e0a.png

总而言之,JAVA 9 的新特性还有很多,比如: 更新了进程相关接口(可以直接获取 pid! )[102], 统一JVM日志[158],增强javadoc支持HTML5[224], javadoc 页面终于加上了搜索条:) [225], 缺省GC 改为 G1 [248] , 实现SHA-3加密散列函数[287], 等等。

这里就不一一列举了, 期待大家进行更深入的研究与分享。

备注

文中提到的链接:

JDK 9 新特性

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

JDK 9 下载链接

http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html

JDK 18.3 项目链接

http://openjdk.java.net/projects/jdk/18.3/

jigsaw 项目链接

http://openjdk.java.net/projects/jigsaw/

模块依赖关系图

https://bugs.openjdk.java.net/secure/attachment/72525/jdk.png

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前沿报告|AI系列报告之:智能计算芯片

来源:中国电子技术化标准研究院 概要:人工智能时代的到来,智能计算芯片需求旺盛颇具投资价值

java编译命令带参数_java编译命令基础知识点

我们在对计算机下达指令时&#xff0c;人类的语言它是不能够明白&#xff0c;需要通过编译的时候翻译成计算机能听懂的语言。编译过程中会调用javac命令&#xff0c;这点大家可能接触的不多&#xff0c;毕竟是是计算机程序内部运行时的操作。下面我们就编译的概念、命令带来讲解…

一文读懂工业物联网 全面起底核心玩家和技术体系

来源&#xff1a;智东西概要&#xff1a;未来10年内&#xff0c;全球物联网将创造10多万亿美元的价值&#xff0c;约占全球经济的1/10&#xff0c;并与城市管理、生产制造、汽车驾驶、能源环保等形成数个千亿级规模以上的细分市场。物联网进入与传统产业深度融合发展的崭新阶段…

java 枚举可以循环吗_(转载)java 枚举 循环遍历以及一些简单常见的使用

本文转载自&#xff1a;http://blog.csdn.net/qq_27093465/article/details/51706076 作者&#xff1a;李学凯什么时候想用枚举类型&#xff1a;有时候&#xff0c;在设计一个java model对象的时候&#xff0c;你需要一些具体的常量字符串之类的东西&#xff0c;这个东西又没必…

【免费获取】80+页PPT全方位解读半导体行业

来源&#xff1a;新材料在线概要&#xff1a;全方位解读半导体行业

java的构造特点_JAVA学习第八课(构造函数及其特点)

构造函数&#xff1a;构造函数&#xff0c;就是在构建 创造对象 时所调用的函数&#xff0c;作用就是给对象进行初始化特点&#xff1a;1.函数名和类名相同2.不需要定义返回值类型3.没有具体的返回值作用&#xff1a;给对象进行初始化注意&#xff1a;1.默认构造函数的特点2.多…

深度学习处在大爆炸时代的边缘

原作者&#xff1a;Alex Hickey译者&#xff1a;宋榕概要&#xff1a;人工智能&#xff08;AI&#xff09;、机器学习和深度学习的早期应用有望在短期和长期内分别取得的创造性和生产性效益。因此多数服务提供商正在逐步加大在深度学习上的投资。据Gartner咨询公司报道&#xf…

AI在行动:改变科学界的人工智能

来源&#xff1a;世界科学概要&#xff1a;社交媒体拥有数以亿计的用户&#xff0c;他们每年发布数以千亿计的微博和帖子&#xff0c;这将社会科学推向了大数据时代。人工智能“知道”星系应该是什么样的&#xff0c;它把一张模糊的图像&#xff08;左&#xff09;变成了一张清…

java web js加版本号_[Java教程]js 比较版本号(一)

[Java教程]js 比较版本号(一)0 2016-07-03 15:00:13最近群了有人问如何比较版本号&#xff0c;我好奇的试了一下。比较版本号&#xff0c;怎么办&#xff1f;懒人的方法是借鉴&#xff0c;先查网上的资料&#xff0c;看看有木有直接的帮过来的。而且直接便捷的好像在茫茫"…

麦肯锡全球调研160个案例,发布5个行业34个AI应用场景

来源&#xff1a;全球人工智能概要&#xff1a;“我觉得不行&#xff01;”&#xff1b;“我觉得可以&#xff01;”这正是现在大家看待AI的两种态度。“我觉得不行&#xff01;”&#xff1b;“我觉得可以&#xff01;”这正是现在大家看待AI的两种态度。有人觉得现在去谈人工…

让计算机拥有一双眼睛,人工智能科学家已经努力了半个世纪

来源&#xff1a;科技行者概要&#xff1a;计算机算法可以从面相判断一个人的性取向&#xff0c;引发了对隐私、道德、伦理问题的争议。然而回过头去看&#xff0c;在人工智能领域&#xff0c;它是图像识别和机器人视觉的核心部分。最近斯坦福大学一篇论文《Deep neural networ…

php点击验证码,用PHP实现验证码功能

作者:hutuworm 来源:糊涂馋寺牐犇壳埃不少网站为了防止用户利用机器人自动注册、登录、灌水&#xff0c;都采用了验证码技术。所谓验证码&#xff0c;就是将一串随机产生的数字或符号&#xff0c;生成一幅图片&#xff0c;图片里加上一些干扰象素(防止OCR)&#xff0c;由用户肉…

业界 | 计算芯片革命来临?英伟达谷歌入局紧逼英特尔

来源&#xff1a;AI科技评论概要&#xff1a;为了能够满足高速增长的计算需求&#xff0c;一些科技巨头们现在正从生物学中寻找灵感。他们正在重新思考电脑的本质&#xff0c;然后建造更像人类大脑的机器&#xff1a;神经系统里要有一个中央脑干&#xff0c;然后把听、说这样的…

php tp框架分页源代码,ThinkPHP3.2框架自带分页功能实现方法示例

本文实例讲述了ThinkPHP3.2框架自带分页功能实现方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1.前端-分页代码&#xff1a;{$page}2.创建分页样式&#xff1a;如page.css 并将以下代码复制到该文件中.pages{float: right}.pages a,.pages span {display:inline…

【研究报告】城市云脑,智慧城市2.0产生背后的深层原因,两个重要特征是关键

作者&#xff1a;计算机博士&#xff0c;互联网进化论作者 刘锋到2017年&#xff0c;智慧城市与脑的关键词不断涌现&#xff0c;在互联网云脑的研究基础上&#xff0c;城市云脑形成更为清晰的定义&#xff0c;从2009年智慧地球和智慧城市提出以来&#xff0c;经过8年时间&#…

机器人也需要拥有属于自己的性格

原作者&#xff1a;STEPH HAY, CAPITAL ONE译者&#xff1a;彭婷概要&#xff1a;建立信任最有效的方法之一就是在你的每一次互动中始终如一地展示你的人格的完整性。现实生活中是如此&#xff0c;在AI中也是如此。对话设计师Mindy Gold曾经设计出一款没有明确名称以及性别的健…

IBM Watson 的中国生意

来源&#xff1a;财经杂志概要&#xff1a;鉴于过往&#xff0c;IBM的此次转型更具深意。这家巨头公司此次转型的任务是&#xff0c;业务架构要从软件硬件服务&#xff0c;转变为云认知行业。IBM的这场转型尚未到最终评定是否成功的阶段&#xff0c;但新的业务组合收入如果超过…

java 包含汉字,java判断字符串中是否包含汉字

java判断字符串中是否包含汉字package com.zuidaima.util;/**[email protected] www.zuidaima.com**/public class test {public static void main(String[] args) {String a "中国China";for (int ia.length(); --i>0;) {String b a.substring(i, i1);boolean …

2013-2017:中国 CV(计算机视觉)公司恩仇录

来源&#xff1a;KnowingAI知智概要&#xff1a;这是属于中国 CV&#xff08;计算机视觉&#xff09;公司的五年&#xff0c;这是属于他们的时代。2013 年新广告法还没实行&#xff0c;旷视科技为 Face 写下文案&#xff1a;「最好的人脸识别云计算平台」。2014 年是「格灵深瞳…

git php自动发布,使用 Git Hooks 实现自动部署PHP项目

最近正在寻找一种简便的自动部署代码到服务器的方式&#xff0c;然后就发现了git hooks这个方法&#xff0c;查了一些资料再自己尝试过后&#xff0c;觉得还不错&#xff0c;记录下。什么是git hooks在git上是这么介绍的&#xff1a;和其它版本控制系统一样&#xff0c;Git能在…