JDK9 学习之二 - Jshell(java 函数变成交互式 shell)

  1. jshell介绍

谁说原生java不能函数式编成!

JShell(JAVA Shell tool)是用来学习java语言和代码设计的一个交互式工具。JShell是一个Read-Evaluate-Print Loop (REPL)阅读-键入-打印-循环系统(函数式编成),他可以进行代码声明、输入语句、输入表达式 然后直接显示结果。 然后这是一个命令行工具。

  1. 为什么使用Jshell

使用Jshell 你可以对程序过程中任意对象随时查看打印结果,而且可以根据实际情况立即作出调整。

写一个java 程序一般涉及到下面几个步骤:

1. 写一个完整的程序
2. 编译&修改编译错误
3. 运行程序
4. 看下哪里错了
5. 修改代码
6. 然后循环1->5 直到全部OK

Jshell可以实验你的代码还可以探索性的开发你的程序。你可以随意编写代码,提炼出一个精良方法,也可以在jshell session里边试用一些不熟悉的API。
Jshell当然不能替代IDE啦,但是你可以先把代码在jshell里边试验成功以后(因为这样就不用重复上面那个重复编译的循环)然后就可以粘贴到你的IDE里边去用了。

  1. Jshell的启动和停止

Jshell 包含在JDK9里边,所以必须要安装JDK9。进入命令行(windows下是CMD),如果你没有将$JAVA/bin 加入到系统PATH中,那么你只能进入到$JAVA_HOME/bin 使用./jshell进行启动了

  1. Jshell启动两种模式

  • 正常模式
% jshell
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro
#这里已经进入jshell了。
jshell>
  • 详情模式(-v)

详情模式是方便你看到例子和教程同步,也就是可以很方便得到引导和错误反馈。当你已经很熟悉这个工具了,那你就可以尝试使用其他正常的或者间接模式(其他模式)
启动详情模式用 -v 选项:

% jshell -v
To exit JShell, enter /exit:

jshell> /exit
|  Goodbye
  1. 完整例子(功能演示)

leombp:~ Leo$ jshell -v
jshell> /help intro                 #查看系统大概的帮助
|  
|  intro
|  
|  使用 jshell 工具可以执行 Java 代码, 从而立即获取结果。
|  您可以输入 Java 定义 (变量, 方法, 类, 等等), 例如:  int x = 8
|  或 Java 表达式, 例如:  x + x
|  或 Java 语句或导入。
|  这些小块的 Java 代码称为 '片段'。
|  
|  这些 jshell 命令还可以让您了解和
|  控制您正在执行的操作, 例如:  /list
|  
|  有关命令的列表, 请执行: /help

jshell> test                        # 测试下详细模式的错误日志
|  错误:
|  找不到符号
|    符号:   变量 test
|    位置: 类 
|  test
|  ^--^

jshell> 1+1                         #可以很方便进行数字简单计算
$1 ==> 2
|  已创建暂存变量 $1 : int

jshell> int a=10                    #正常定义变量
a ==> 10
|  已创建 变量 a : int
        
jshell> String twice(String s){     #函数式定义方法
   ...> return s + s;
   ...> }
|  已创建 方法 twice(String)

jshell> twice(                      #调用方法,这里类似Linux 按tab键可以想IDE一样进行提示。
twice(   

jshell> twice("I Love This Game. ")                #调用成功
$4 ==> "I Love This Game. I Love This Game. "
|  已创建暂存变量 $4 : String

jshell> $4                         #返回系统自动声明一个变量$4
$4 ==> "I Love This Game. I Love This Game. "
|  $4 的值: String

jshell> int divide(int x,int y){   #定义一个方法进行异常测试
   ...> return x /y ;
   ...> }
|  已创建 方法 divide(int,int)

jshell> dived                      #按tab进行提示
jshell> divide(10,0)               #异常
|  java.lang.ArithmeticException thrown: / by zero
|        at divide (#6:2)
|        at (#7:1)

jshell> /list                      #查看用户定义

   1 : 1+1
   2 : int a=10;
   3 : String twice(String s){
       return s + s;
       }
   4 : twice("I Love This Game. ")
   5 : $4
   6 : int divide(int x,int y){
       return x /y ;
       }
   7 : divide(10,0)

jshell> "str".                     #测试下tab对对象的自动提示
charAt(                chars()                codePointAt(           
codePointBefore(       codePointCount(        codePoints()           
compareTo(             compareToIgnoreCase(   concat(                
contains(              contentEquals(         endsWith(              
equals(                equalsIgnoreCase(      getBytes(              
getChars(              getClass()             hashCode()             
indexOf(               intern()               isEmpty()              
lastIndexOf(           length()               matches(               
notify()               notifyAll()            offsetByCodePoints(    
regionMatches(         replace(               replaceAll(            
replaceFirst(          split(                 startsWith(            
subSequence(           substring(             toCharArray()          
toLowerCase(           toString()             toUpperCase(           
trim()                 wait(                  


#测试自动导入
#Shift + Tab + i后出现意外的字符。
#Mac下是 `tab + i` 进行自动导入。
jshell> new JFrame
0: 不执行任何操作
1: import: javax.swing.JFrame
选项:                                    #我输入了 1
Imported: javax.swing.JFrame

jshell> new JFrame

jshell> /exit                            #退出命令
|  再见


参考:
Java Platform, Standard Edition Tools Reference

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,019评论 25 707
  • ~(•⚈͒⌄⚈͒•)~(•⚈͒⌄⚈͒•)~(•⚈͒⌄⚈͒•)~ 【安安每日阅读分享】 2018-02-01-Thu...
    安安Ro7cie阅读 260评论 0 0
  • 来往 来往 来来又往往 人生本就是一场来往 来的是朋友 去的是过客 一辈子,一场情 孑孑然一身 冲冲然一走 不后悔...
    御姐姐不是人生阅读 231评论 4 7
  • #不给别人添麻烦,是不是一种美德#这是今晚奇葩说的题目 最后康永哥和罗振宇的那段很让人值得思考。可以说没有了别人,...
    相信那个相信你的我阅读 327评论 0 1
  • 颜陵作为丞相之子,一直都是夜宸惜得力的臣子手下,只要是夜宸惜想要的东西,即使远在天边,颜陵也会给他找到,颜陵说过“...
    东乐双子年华似水阅读 372评论 0 2