资讯专栏INFORMATION COLUMN

Java9特性预览——Jshell

hikui / 1296人阅读

摘要:什么是项目是第一个官方的的缩写,即交互式编程环境,是一种命令行工具。它允许你无需编写类或者方法来执行语句。它与的解释器或其它本地支持的语言,如和类似。在即将到来的的特性中,这绝对是更有趣的特性之一。

什么是JShell?

JShell/Kulla项目是第一个官方的Java REPL (Read-Eval-Print-Loop的缩写,即交互式编程环境),是一种命令行工具。它允许你无需编写类或者方法来执行Java语句。它与Python的解释器或其它本地支持REPL的JVM语言,如Scala和Groovy类似。在Java 9即将到来的的特性中,这绝对是更有趣的特性之一。

JShell的使用 命令行中直接使用

下载安装OpenJDK9,然后我们就可以在安装目录的bin文件夹下看到 jshell.exe ,如果你配置好了环境变量,那么就可以在命令行中使用了。

我们来看下Jshell可以有什么设置选项:

/list:用于查看你之前输入的语句的信息

/vars:用于查看你之前输入的变量,如果你只是输入了一个表达式,Jshell会将计算结果保存为一个变量

我们并没有声明$1变量,但是Jshell默认将表达式的结果转为变量进行了存储,所以我们可以直接使用改变量:

/save:存储之前的输入

我们执行:


会将文件存储到你的用户文件目录下(你也可以指定完整的路径)

我们来看看存储的文件的内容:

1+1
1+1
2+2
$1
System.out.print($1)

其实就是简单将你的输入进行了保存

/reset:重置,会清楚你之前输入的内容

/open:打开一个文件并执行其中内容

/methods:获取声明的或者使用到静态方法

/types:显示接口、类、枚举等信息

/imports:获取导入的包

上面的包都是默认导入的包这样我们就能直接使用这些包中的类而无需自己声明

/exit:退出Jshell

/reload:重置后重新加载之前的内容

/classpath :这个用于你使用自己声明的类的时候可以将目录添加到classpath进行引用 /history:查看之前所有输入的命令

/retain editor|start|feedback|mode 用于保存配置信息方便 别的环境中/set editor|start|feedback|mode来获得样的配置 /id:重新执行某个id的操作

/-n:重新运行前面的第 n 个片段

在代码中的使用

JDK9将Jshell相关API封装为模块(模块相关知识可以查看 模块化简单教程)方便使用。下面我们通过代码来学习一下相关的API:

package com.coderknock;
import java.io.ByteArrayInputStream;
import java.io.Console;
import java.util.List;
import jdk.jshell.*;
import jdk.jshell.Snippet.Status;
/**
 * 拿客
 * www.coderknock.com
 * QQ群:213732117
 * 创建时间:2016年06月29日
 * 描述:JShell
 */
public class JshellMain {
    public static void main(String[] args) {
         Console console = System.console();
         //创建一个Jshell环境,之后会自动进行关闭
         try (JShell js = JShell.create()) {
             //循环监听输出
             do {
                 System.out.print("请输入一些Java代码: ");
                 String input = console.readLine();
                 if (input == null) {
                     break;
                 }
                 //将输入的指令转化为SnippetEvent对象
                 List events = js.eval(input);
                 for (SnippetEvent e : events) {
                     StringBuilder sb = new StringBuilder();
                     if (e.causeSnippet() == null) {
                         //  我们有一个片段创建的事件
                         switch (e.status()) {//根据代码片段的执行进行输出
                             case VALID:
                                 sb.append("Successful ");
                                 break;
                             case RECOVERABLE_DEFINED:
                                 sb.append("With unresolved references ");
                                 break;
                             case RECOVERABLE_NOT_DEFINED:
                                 sb.append("Possibly reparable, failed  ");
                                 break;
                             case REJECTED:
                                 sb.append("Failed ");
                                 break;
                         }
                         if (e.previousStatus() == Status.NONEXISTENT) {
                             sb.append("addition");
                         } else {
                             sb.append("modification");
                         }
                         sb.append(" of ");
                         sb.append(e.snippet().source());
                         System.out.println(sb);
                         if (e.value() != null) {
                             System.out.printf("Value is: %s
", e.value());
                         }
                         System.out.flush();
                     }
                 }
             } while (true);
         }
         System.out.println("
Goodbye");
     }
}

进行编译javac JshellMain.java -encoding UTF-8
运行结果:

当输入错误的java代码时:

执行for循环等:

我是广告

本人的直播课程在 7 月份就要开始了,希望小伙伴们支持一下,现在报名有优惠噢

https://segmentfault.com/l/15...

https://segmentfault.com/l/15...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67217.html

相关文章

  • Java9的新特性

    摘要:新特性概述系列一安装及使用系列二运行系列三模块系统精要系列四更新系列五系列六系列七系列八系列九与的区别迁移注意事项参数迁移相关选项解析使用构建实例使用示例带你提前了解中的新特性 Java语言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性...

    ddongjian0000 评论0 收藏0
  • Java 9 新特性

    摘要:在语言上并没有添加太多的新特性,但在使用性能上做了很改进。二多版本包支持即在不同版本下,执行相应版本的代码。在发布新版本的后,用户可能不会升级到新环境,但是项目可能会开始逐步升级到新版本,来提前适应即将到来的环境。 Java9在语言上并没有添加太多的新特性,但在使用、性能上做了很改进。 一、模块间引用 Java9添加了模块化的概念,使得之前的控制访问权限有了改变。 之前: publ...

    SegmentFault 评论0 收藏0
  • java9系列(一)安装及jshell使用

    摘要:序本文介绍下下面的版本安装使用。下载官网地址安装路径下载袭来是个文件,双击安装,默认装到了这里,的地址是看下版本欢迎使用版本要大致了解该版本请键入有了就可以快速做一些验证,比如查看导入的类库方法定义及调用已创建方法已修改方法查看历史 序 本文介绍下mac下面的java9版本安装使用。 下载 官网地址http://www.oracle.com/technet... 安装路径 下载袭来是个...

    gaosboy 评论0 收藏0
  • java9系列(二)docker运行java9

    摘要:序本文介绍下如何在运行镜像启动然后就可以正常使用了,比如退出查看此镜像的版本 序 本文介绍下如何在docker运行java9 镜像 docker pull openjdk:9-jdk 启动 docker run -it openjdk:9-jdk /bin/jshell 然后就可以正常使用jshell了,比如 Sep 22, 2017 2:16:12 AM java.util.pref...

    Integ 评论0 收藏0
  • 5分钟学会Java9-Java11的七大新特性

    摘要:来来来,花分钟看看的七大新特性,还有代码样例。本地是指方法内的变量声明。从开始,这个正式进入标准库包。同步请求会阻止当前线程。可喜的是,如果尝试改变不可变集合,会通过发出警告是在中引入的,增加了三个新方法。 现在Java有多元化的发展趋势,既有JS又有C++还有C#的影子,不学习那是不行滴。来来来,花5分钟看看Java9-Java11的七大新特性,还有代码样例。Java11 发布了,然...

    xuhong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<