JAVA9 JShell 初体验

本贴最后更新于 2740 天前,其中的信息可能已经物是人非

JAVA 9 JShell 初体验


时隔三年之久,新的 JAVASE 版本 JAVA9 终于正式发布了,喜欢尝鲜的同学们就一起来看看 JAVA9 引入了哪些新的特性吧。

A. 概括介绍

  1. 模块系统

在 java9 中引入了 module 系统,来封装代码和数据,改善 java 应用程序的依赖和部署问题

  1. REPL

属于 java 语言的交互式解释器,允许你快速验证原型和执行代码片段。目前一些小的,工具化,重复性的任务主要使用 Bash,Python 等动态类型的语言去实现,以后应该会有同学用 Java 去写脚本(^▽^)

  1. 语言变化

更简洁的 try-with-resources 语法,接口内部允许定义私有方法,匿名内部类支持 diamond syntax 等

  1. 其他更新:Javascript 引擎 Nashorn 更新,支持了部分 ES6 特性,新的版本字符串,安全,并发等方面的更新。全部新特性参见 Java9 新特性一览

B. 环境安装(CentOS Linux release 7.2 示例)

  1. Oracle JDK 9 下载地址
  2. 以管理员权限执行 rpm -ivh jdk-9_linux-x64_bin.rpm
  3. 在终端输入 java -version,验证安装
[ldd@localhost learn]$ java -version java version "9" Java(TM) SE Runtime Environment (build 9+181) Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)

C. REPL 使用

C.1 打开和退出 jshell

在终端输入 jshell 命令,按回车,即进入 shell 解释器

[ldd@localhost learn]$ jshell | Welcome to JShell -- Version 9 | For an introduction type: /help intro jshell>

输入/exit,按回车退出 jshell

jshell> /exit | Goodbye [ldd@localhost learn]$

C.2 Hello World

在终端输入 jshell PRINTING,进入 jshell 解释器

[ldd@localhost learn]$ jshell PRINTING | Welcome to JShell -- Version 9 | For an introduction type: /help intro jshell> println("Hello World") Hello World jshell>

jshell 解释器启动的完整语法为 jshell [options] [load-files],其中 [options] 指定了启动的参数,[load-files] 则指定了在启动是要执行的 jshell 脚本,脚本可以是任意的 jshell 代码片段,系统默认定了三个常用的启动脚本:DEFAULT,JAVASE,PRINTING,在上述脚本中,我们指定了启动 jshell 时执行 PRINTING 脚本

DEFAULT 脚本:导入一些常用的 javase 包,比如 java.io,java.math,java.util 等
JAVASE 脚本:导入所有的 javase 包,此方式加载的包较多
PRINTING 脚本:在 DEFAULT 的基础上,将 print,println,printf 定义为 jshell 方法,无需通过 System.out.println() 的方式使用

C.3 定义变量,方法和类型

可以在 jshell 中输入任意合法的 java 代码片段,包括变量定义,方法定义,类型定义,导入类型等等。在语句后面的分号可以省略,解释器会自动在行尾添加分号

  • 定义和使用变量
jshell> int a=3 a ==> 3 jshell> String str="hello jshell" str ==> "hello jshell" jshell> System.out.println(str) hello jshell jshell>
  • 定义和调用方法
jshell> void printNowTime(){ ...> Date now=new Date(); ...> System.out.println(now); ...> } | created method printNowTime() jshell> printNowTime() Fri Sep 22 02:04:34 PDT 2017 jshell>
  • 定义类型,实例化对象
    由于类型定义的代码片段较长,我们用 vim 新建 person.txt 文本文件,定义 Person 类型如下:
public class Person{ private int id; private String name; public Person(int id,String name) { this.id=id; this.name=name; } public String toString() { return "id:"+this.id+",name:"+this.name; } }

用 jshell 命令,指定 person.txt 为启动脚本,加载其中定义的 Person 类型

[ldd@localhost learn]$ jshell person.txt | Welcome to JShell -- Version 9 | For an introduction type: /help intro jshell> /types | class Person jshell> Person p=new Person(1,"zhangsan") p ==> id:1,name:zhangsan jshell> System.out.println(p) id:1,name:zhangsan jshell>
  • 当前环境中的变量,方法,类型,导入查看
    jshell 提供了多个命令来查看当前 jshell 环境中的数据,/vars 查看变量定义,/methods 查看方法定义,/types 查看类型定义,/import 查看导入的包
jshell> int a=3 a ==> 3 jshell> /vars | int a = 3 jshell> void sayHello(){ ...> println("hello"); ...> } | created method sayHello() jshell> /methods | void print(boolean) #以PRINTING作为启动脚本导入一系列的打印方法 | ...... | void println(Object) | void printf(java.util.Locale,String,Object...) | void printf(String,Object...) | void sayHello() #我们定义的方法 jshell> public class Student{ ...> } | created class Student jshell> /types | class Student jshell> /import | import java.io.* | import java.math.* | import java.net.* | import java.nio.file.* | import java.util.* | import java.util.concurrent.* | import java.util.function.* | import java.util.prefs.* | import java.util.regex.* | import java.util.stream.* jshell>

C.4 删除定义的变量,方法和类型

jshell 中使用 /drop [name[ name...]|id[ id...]] 语法,删除已经定义的变量类型和方法。多个名称之间使用空格分隔

jshell> /drop Student | dropped class Student jshell>

D. 总结

总的来说,jshell 为我们快速验证原型,使用 java 进行简单的 url 访问,或者写个小工具处理一些重复性的任务还是有很多帮助的。至于以后其能否作为脚本语言,发挥更大的用处,就不得而知了。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3194 引用 • 8214 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • zonghua

    😂 为什么不用 groovy shell 呢,groovy 无缝兼容 java 用起来方便极了。

  • 其他回帖
  • someone9891 via macOS

    收费不?