JAVA9 JShell 初体验

2019-07-04 00:00:00 初体验 Java9 JShell

JAVA9 JShell 初体验

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

更新:知乎不支持markdown,我也是醉了。

A. 概括介绍

1.模块系统

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

2.REPL

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

3.语言变化

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

4.其他更新

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,验证安装
  4. [ldd@localhost learn]$ java -version
  5. java version “9”
  6. Java(TM) SE Runtime Environment (build 9+181)
  7. Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)

C. REPL使用

C.1 打开和退出jshell

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

  1. [ldd@localhost learn]$ jshell
  2. | Welcome to JShell — Version 9
  3. | For an introduction type: /help intro
  4. jshell>

输入/exit,按回车退出jshell

  1. jshell> /exit
  2. | Goodbye
  3. [ldd@localhost learn]$

C.2 Hello World

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

  1. [ldd@localhost learn]$ jshell PRINTING
  2. | Welcome to JShell — Version 9
  3. | For an introduction type: /help intro
  4. jshell> println(“Hello World”)
  5. Hello World
  6. 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代码片段,包括变量定义,方法定义,类型定义,导入类型等等。在语句后面的分号可以省略,解释器会自动在行尾添加分号

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

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

  1. [ldd@localhost learn]$ jshell person.txt
  2. | Welcome to JShell — Version 9
  3. | For an introduction type: /help intro
  4. jshell> /types
  5. | class Person
  6. jshell> Person p=new Person(1,”zhangsan”)
  7. p ==> id:1,name:zhangsan
  8. jshell> System.out.println(p)
  9. id:1,name:zhangsan
  10. jshell>
  • 当前环境中的变量,方法,类型,导入查看
    jshell提供了多个命令来查看当前jshell环境中的数据,/vars查看变量定义,/methods查看方法定义,/types查看类型定义,/import查看导入的包
  1. jshell> int a=3
  2. a ==> 3
  3. jshell> /vars
  4. | int a = 3
  5. jshell> void sayHello(){
  6. …> println(“hello”);
  7. …> }
  8. | created method sayHello()
  9. jshell> /methods
  10. | void print(boolean) #以PRINTING作为启动脚本导入一系列的打印方法
  11. | ……
  12. | void println(Object)
  13. | void printf(java.util.Locale,String,Object…)
  14. | void printf(String,Object…)
  15. | void sayHello() #我们定义的方法
  16. jshell> public class Student{
  17. …> }
  18. | created class Student
  19. jshell> /types
  20. | class Student
  21. jshell> /import
  22. | import java.io.*
  23. | import java.math.*
  24. | import java.net.*
  25. | import java.nio.file.*
  26. | import java.util.*
  27. | import java.util.concurrent.*
  28. | import java.util.function.*
  29. | import java.util.prefs.*
  30. | import java.util.regex.*
  31. | import java.util.stream.*
  32. jshell>

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

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

  1. jshell> /drop Student
  2. | dropped class Student
  3. jshell>

D. 总结

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

原文发布在lddhappy,转载请注明出处。

    原文作者:刘冬冬
    原文地址: https://zhuanlan.zhihu.com/p/29583770
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章