JAVA9 JShell 初体验

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

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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • 收费不?

  • 其他回帖
  • zonghua

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