zoukankan      html  css  js  c++  java
  • jdk9-jshell

    在jdk9中包含了一个REPL形式的交互式shell工具,它可以实时反馈java语法的运行结果,下面做一下简单介绍

    准备

    需要安装jdk9

    运行

    将jdk9的bin目录配置到path目录并在命令行运行jshell,或cd到jdk9的bin目录直接运行jshell,就可以进入jshell的命令提示符

    bin>jshell.exe
    |  欢迎使用 JShell -- 版本 9
    |  要大致了解该版本, 请键入: /help intro
    
    jshell>
    

    之后可以键入想要运行的代码

    jshell> String name="world"
    name ==> "world"
    
    jshell> void hello(String name){
       ...> System.out.println("hello "+name);
       ...> }
    |  已创建 方法 hello(String)
    
    jshell> hello(name)
    hello world
    

    可以看到这里并不需要按java语法创建类,以及main方法,每条命令都会实时返回结果,而且命令结束的分号是可选的(但方法内的代码的分号不可省略)。
    如果方法中有依赖其他变量或方法也不会影响方法创建,jshell能自动识别,但只有所有依赖都创建完,这个方法才可被运行

    jshell> int circumference(int r){
       ...> return 2*PI*r;
       ...> }
    |  已创建 方法 circumference(int), 不过, 它无法调用, 直至 variable PI 已声明
    

    由于没有定义PI常量,虽然方法创建了,但不能运行。
    重复定义方法或变量可以覆盖原有的方法/变量
    如果需要import其他数据类型,有两种方法,一个是输入import XXXX,还有一种是new对象时,按shift+tab,释放后按i,之后会有提示,按提示就可import对应的类

    jshell> new JFrame <shift+tab> <i>
    0: 不执行任何操作
    1: import: javax.swing.JFrame
    选项:
    Imported: javax.swing.JFrame
    
    jshell> new JFrame
    

    shift+tab释放后按v可以快速为当前行的命令创建变量,

    jshell> new BigDecimal(1) <shift+tab> <v>
    jshell> BigDecimal | = new BigDecimal(1)
    

    光标会自动移到|位置,供用户输入
    当代码抛出异常时,异常的信息的堆栈会打印成(snippetId:行号)的形式,其中snippetId是所有变量/方法被分配的递增编号

    jshell> void ex(){
       ...> throw new RuntimeException();
       ...> }
    |  已创建 方法 ex()
    
    jshell> ex()
    |  java.lang.RuntimeException thrown:
    |        at ex (#1:2)
    |        at (#2:1)
    

    command

    除了普通java语言,jshell还有一些command,这里介绍一些常用的,其他可以通过/help查看
    /exit 退出jshell
    /list 显示所有创建的变量和方法(Snippets)

    jshell> /list -all
      s1 : import java.io.*;
      s2 : import java.math.*;
      s3 : import java.net.*;
      s4 : import java.nio.file.*;
      s5 : import java.util.*;
      s6 : import java.util.concurrent.*;
      s7 : import java.util.function.*;
      s8 : import java.util.prefs.*;
      s9 : import java.util.regex.*;
     s10 : import java.util.stream.*;
       1 : import javax.swing.JFrame;
       2 : BigDecimal a = new BigDecimal(1);
    

    -all参数显示所有snippets,每行冒号前是snippetId,s开头的是默认加载的snippets,这里引用了常用的包
    /save <文件名> 保存当前snippets,会将当前所有snippets保存成文本形式
    /open <文件名> 加载保存的snippets,jshell默认提供了几个script DEFAULT:默认启动引用的package PRINTING:简化打印方法的调用,免去输入System.out JAVASE:引入javaSe的package
    /env --class-path <classPath> 定义classpath用于引入外部依赖的包

  • 相关阅读:
    linux 环境变量 ($PATH)
    read()、write()返回 Input/output error, Device or resource busy解决
    初次尝试一个注册表
    CSS定位
    CSS中颜色代码和单位
    DOM和BOM
    java代码中获取classpath路径
    黑盒测试与白盒测试相比,哪个更难
    LoadRunner11遇到问题及解决办法
    Linux下修改日期和时间
  • 原文地址:https://www.cnblogs.com/resentment/p/7631961.html
Copyright © 2011-2022 走看看