JDK9特性——模块化&REPL工具

文章目录

前言

谈到Java9大家往往第一个想到的就是Jigsaw项目(后改名为Modularity)。众所周知,Java已经发展超过20年(95年最初发布),Java和相关生态在不断丰富的同时也越来越暴露出一些问题:

  1. Java运行环境的膨胀和臃肿。每次JVM启动的时候,至少会有30~ 60MB的内存加载,主要原因是JVM需要加载rt.jar,不管其中的类是否被classloader加载,第一步整个jar都会被JVM加载到内存当中去。
  2. 当代码库越来越大,创建复杂,盘根错节的"意大利面条式代码"的几率呈指数级的增长。不同版本的类库交叉依赖导致让人头疼的问题,这些都阻碍了Java 开发和运行效率的提升。
  3. 很难真正地对代码进行封装,而系统并没有对不同部分(也就是JAR文件)之间的依赖关系有个明确的概念。每一个公共类都可以被类路径之下任何其它的公共类所访问到,这样就会导致无意中使用了并不想被公开访问的API。

模块化

(而模块化可以根据模块的需要加载程序运行需要的class)

本质上讲,模块化就是在package外面包裹一层(说白了就是项目下有众多模块),进行管理各个模块,比如一个电商项目下面有支付模块、购物模块,模块跟模块之间相互调用,这样代码就更安全。

模块之间的可访问性是所使用的模块和使用模块之间的双向协议:模块明确地使其公共类型可供其他模块使用,而且使用这些公共类型的模块明确声明对第一个模块的依赖,模块中所有未导出的软件包都是模块的私有的,他们不能在模块之外使用。

模块化案例

创建一个普通的Java项目

然后在这个项目下准备两个模块。

然后在JDK19Module1中添加一些类

然后我们需要考虑如何在JDK19module2中使用这个类?,或者说是使用模块1中的类。

第一步,在两个模块的src下创建各自的module-info.java

创建完毕的结构为:

在JDK19Module1的module-info.java文件中。设置哪些包可以向外暴露

然后在JDK19Module2的module-info.java中引入模块2

但是发现报错了,原因是,我们要把模块1添加为模块2的运行环境,具体操作如下

project structure > modules > JDK19Module2>dependencies >>+module lib > JDK19Module1> apply >>ok

这个是时候,在模块2中就可以使用模块1 中的类了

可交互的REPL工具

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

要想实现REPL,需要一个命令:JShell命令(linux中是shell命令,java中的shell命令)

将环境变量配置为java9,就可以在控制命令台使用jshell命令了:如果电脑上安装了其他版本的JDK,环境变量也是其他版本,可以在dos上通过cd 切换到指定版本的bin目录下,就可以使用该版本的jshell了.

简单的输出语句

上面操作的代码关闭窗口后就消失了。如果我们需要持久化相关的代码,也可以操作

退出jshell

shell 复制代码
/exit
相关推荐
程序员张333 分钟前
Maven编译和打包插件
java·spring boot·maven
ybq195133454311 小时前
Redis-主从复制-分布式系统
java·数据库·redis
weixin_472339462 小时前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
小毛驴8502 小时前
Linux 后台启动java jar 程序 nohup java -jar
java·linux·jar
枯萎穿心攻击3 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
DKPT3 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
Eiceblue4 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
好奇的菜鸟4 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
m0_555762905 小时前
Matlab 频谱分析 (Spectral Analysis)
开发语言·matlab
DuelCode5 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis