点击蓝色“程序猿DD”关注我

回复“资源”获取独家整理的学习资料!

作者 | Queena

来源 | 公众号「锅外的大佬」

Jshell 作为 Kulla 项目下 Java 增强建议(JEP) 222 的一部分而被引入在 JDK 9 中。许多编程语言,例如 JavaScript,Python,Ruby 等为他们的执行提供一些易于使用的命令行工具,但是 Java 仍然缺少这样的实用工具。因此, JDK 9 引入了 Java shell (JShell)工具。

我在前一篇 文章 中讨论了 JShell (这是一个读-求值-打印循环:REPL) 的基础知识。在本文中,我将介绍 JShell 中的一些高级概念,这些概念是用户在快速开发时应该了解的。

1.   重新声明变量

在 java 中,是不可能重新声明变量的。当然,在 JShell 的帮助下,您总是可以根据需要重新声明变量。请注意,这适用于原始类型变量和引用变量。事实上,用户可以根据需要多次重新声明。

示例:

jshell> String str="Hello"
str ==> "JShell"
jshell> Integer str=10
str ==> 10

2. 临时变量

如果未由用户明确指定,则从 JShell 命令行中的任何表达式都将分配给某些变量。这些变量称为临时变量。例:

jshell> "Hello"+"JShell"
$1 ==> "HelloJShell"

注意,为了了解变量类型或者更多关于表达式求值的详细信息,我们可以将反馈模式设置为 verbose,如下所示:

/set feedback verbose
jshell> 60+10
$2 ==> 70
|  created scratch variable $21 : int

要退出 verbose 模式,设置反馈模式为 normal :

/set feedback normal

3. JShell 中的前向引用

JShell 中的前向引用允许您预先调用构造,即使它们并不存在。例如,假设有一个名为 greet()  的方法,如下所示。注意,greet()  在内部调用另一个名为 greetHelloWorld()  的方法,该方法尚未声明。创建 greet() 是成功的,但是在声明 greetHelloWorld()  之前不能调用它。这在 JShell 中称为前向引用。

例:

jshell> public void greet(){
...> greetHelloWorld();}
|  created method greet(), however, it cannot be invoked until method greetHelloWorld() is declared               jshell> greet()
|  attempted to call method greet() which cannot be invoked until method greetHelloWorld() is declared
jshell> public void greetHelloWorld(){
...> System.out.println("Hello World");}
|  created method greetHelloWorld()
jshell> greet()
Hello World

4.  JShell 中的异常处理

例:

jshell> int divide(int a,int b) throws IOException{
...> if(b==0){
...> throw new IOException();
...> }
...> return a/b;
...> }
|  created method divide(int,int)
jshell> divide(1,0)
|  java.io.IOException thrown:
|        at divide (#2:3)
|        at (#3:1)

注意,我们没有捕捉到任何由 divide 方法抛出的异常;JShell 负责这方面的工作。还要注意,我们并没有导入  IOException 类,但是代码编译并执行得很好。原因是,对于任何 JShell 会话,默认情况下都会导入一些包。要检查在任意 JShell 会话中默认导入包的方法如下:

jshell> /imports
|    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.*
|    import java.io.IOException

5. JShell会话中指令的持久性行为

默认情况下,所有在 JShell session 中的指令都不持续。当用户从 JShell session 退出时,指令瞬间丢失。

然而,JShell 为用户提供了保存一个特定的 JShell session 信息,并在不同的 JShell Session  中访问该信息的方法。如果用户想要从 JShell session 中保存有用的片段并在不同的 JShell session 中访问它们,是非常方便的。

例:

jshell> String s="Hello"
s ==> "Hello"    jshell> int i=100;
i ==> 100
jshell> /save C:\data\mySession.jsh
jshell> /exit
|  Goodbye  λ jshell
|  Welcome to JShell -- Version 9.0.4
|  For an introduction type: /help intro
jshell> /vars
jshell> /open C:\Data\mySession.jsh
jshell> /vars
|    String s = "Hello"
|    int i = 100

6.  使用外部库

有许多有用的第三方开源库。通常,开发人员将这些库保存在项目的类路径中并使用它。但是,对于 JShell ,使用第三方库非常容易。

举例说明,假设我们想要使用第三方库 Apache Commons Lang 的 String 工具类。下面是在类路径中保存库的语法:

shell> /env --class-path <Relative Path of lib from where JShell is run>
jshell> /env --class-path ../lib/commons-lang3-3.8.1.jar
|  Setting new options and restoring state.
import org.apache.commons.lang3.StringUtils;
jshell> System.out.println(StringUtils.isEmpty(""))
true
jshell> System.out.println(StringUtils.isEmpty("hello"))
false

7. 使用 JShell  标准命令和工具进行快速开发

JShell 有自己的特定的方便命令,可以用于在 JShell 控制台上进行更快的测试。以下是一些有用的命令:

 /history - Prints all commands executed on JShell (Java Commands+ JShell specific commands)

例:

jshell> String s ="Hello"
s ==> "Hello"    jshell> class Employee{
...> }
|  created class Employee   jshell> /vars
|    String s = "Hello"  jshell> /history
String s ="Hello"
class Employee{
}
/vars
/history
 /list    - Prints all JAVA related commands executed in JShell. Notice that this list the command in Numerical              order of each command identifier. This identifier can be used to execute certain construct again.

例:

jshell> /list
1 : String s ="Hello";
2 : class Employee{
}
jshell> /1
String s ="Hello";
s ==> "Hello"
/reset   - Resets the state of current JShell session.
CTRL+R   - For searching a particular command
CTRL+S   - Performing Forward Search
CTRL+C   - To exit from JShell session
/exit    - To exit from JShell session
/vars     - To list all variables inside current JShell session
/imports  - To list all imports inside current JShell session
/help    - To know more about JShell specific commands

8.   JShell 中的代码补全制表符

JShell 允许开发人员使用 Tab 键来自动完成代码构造。

例:

除此之外,用户还可以使用 JShell 查看相关包的文档:

jshell> java.io
io
Signatures:
java.io
<press tab again to see documentation>

9. 在 JShell 中编写一个构造器

在开发过程中,想要在 JShell 会话中编辑以前执行的命令是很常见的。JShell 提供了一个非常方便的命令和编辑器。

例:

/edit        - Edit all constructs in current JShell session
/edit 1      - Edit only 1st construct (see from /list) in current JShell session
/edit Person - Edit only Person class in current JShell session

10.  使用 JShell 编程

JDK 为程序员提供了以编程的方式来访问 JShell 的 API ,而不必通过 REPL 。请参考相应的 Java 文档以获取更多详情。

在本文中,我只展示了 JShell 中的一些高级概念,而这并不是结束。我还建议读者通过 JShell 文档来了解更多信息。

本文通过OpenWrite的免费Markdown转换工具发布

-END-

留言交流不过瘾

关注我,回复“加群”加入各种主题讨论群

关于 JShell,开发人员需要知道的10件事情相关推荐

  1. C#开发人员应该知道的13件事情

    C#开发人员应该知道的13件事情 本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助. 1. 开发过程 开发过程是错误和缺陷开始的地方.使用工具可以帮助你在发布之后,解决掉一些问 ...

  2. C# Development 13 Things Every C# Developer Should Know--C#开发人员应该知道的13件事情

    原文链接:https://dzone.com/refcardz/csharp 本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助. 1. 开发过程 开发过程是错误和缺陷开始的地方 ...

  3. Spring MVC的DispatcherServlet – Java开发人员应该知道的10件事

    如果您使用过Spring MVC,那么您应该知道什么是DispatcherServlet? 它实际上是Spring MVC的心脏,确切地说是MVC设计模式或控制器的C语言. 应该由Spring MVC ...

  4. web项目开发人员配比_Web开发人员应该知道的10个别名

    开发人员和精通技术的人总是被数字所吸引,因此,数字缩写或基于数字的单词很快就受到他们的喜爱,这是理所当然的. 缩写词被用来缩写长单词,这些单词太麻烦了以至于无法一直准确地键入 . 如果缩写同时包含字母 ...

  5. php开发手册要看完吗,9个开发人员应该知道的PHP库

    9个开发人员应该知道的PHP库大多都是国外的资源,不过有了这些PHP库的支持,大家今后进行开发一定能加快速度,不会进行简单的重复劳动. 1. ReCAPTCHA The reCAPTCHA 库让你可以 ...

  6. 每个JavaScript开发人员应该知道的33个概念

    每个JavaScript开发人员应该知道的33个概念 介绍 创建此存储库的目的是帮助开发人员在JavaScript中掌握他们的概念.这不是一项要求,而是未来研究的指南.它基于Stephen Curti ...

  7. 网页最少要有一个html标签,PHP_网页开发人员必须知道的10个不常用HTML标签, 网页开发人员常常希望能 - phpStudy...

    网页开发人员必须知道的10个不常用HTML标签 网页开发人员常常希望能够了解并掌握多种语言,结果是,学习一门语言的所有内容是棘手的,但是却很容易发现你并没有完全利用那些比较特殊却很有用的标签. 不幸的 ...

  8. Java开发人员应该知道的5大Spring Boot功能

    您可能已经听说过Spring Boot,这是用不到140个字符创建一个Spring Web应用程序的神奇力量,可以在一条推文中编写这些字符,但这到底意味着什么? 哪些功能可以使Spring Boot具 ...

  9. 大规模运行MongoDB应该知道的10件事

    MongoDB的首席解决方案架构师Asya Kamsky 最近发表了一篇文章,概括了大规模运行MongoDB需要知道的10件事. MongoDB也需要DevOps.MongoDB是一个数据库.和任何其 ...

最新文章

  1. Spring Security实现登录权限控制,记住我等功能
  2. selection at the technology management
  3. 卷积神经网络——池化层学习——最大池化
  4. 快速学习C语言的途径,让你少走弯路!
  5. 开源干货!.NET Core + Vue.js通用动态权限(RBAC)管理系统框架[DncZeus]开源
  6. 【HDU - 2072 】单词数(字符串读入技巧,sstream大法,水题,字符串读入格式)
  7. WebBrowser,挖坑,跳坑,填坑
  8. python中如何定义函数的传入参数是option的_python – 当使用@ click.option将命令行参数传递给函数时,如何返回值?...
  9. MFC中模态对话框和非模态对话框的差别
  10. java开发搭建环境搭建_Java开发环境搭建
  11. Swift - 使用xib添加新界面
  12. netstat 查看网络连接、路由表、接口状态、端口信息
  13. 武汉大学计算机网络安全学院,消息︱武汉大学计算机学院(新)与国家网络安全学院正式组建...
  14. 华为5G,不服不行!
  15. ubuntu16.04 设置双显示器屏幕
  16. mysql 子链接_MySQL多表查询实例详解【链接查询、子查询等】
  17. mysql monitor怎么用,MySQL数据库 监控工具 myMySQL数据库-monitor 详解 MySQL数据库使用教程...
  18. 我用Python合成大西瓜!
  19. 【HCNA】-【网络模型】
  20. php ThinkPHP文章上一篇、下一篇解决方案

热门文章

  1. python3 模式匹配查找文件路径 glob模块 简介
  2. python3 多级目录建立 os.makedirs()
  3. redis启动问题:/var/redis/run/redis_6379.pid exists, process is already running or crashed
  4. linux objdump 反汇编命令
  5. Windows驱动中的Crash回调
  6. 汇编中Enter和Leave指令
  7. OD命令大全(OllyDbg命令)
  8. Android开发--浅谈ExpandableListActivity
  9. OpenStack-MitakaCentos7.2双节点搭建--(三)Glance(镜像服务)
  10. Pci设备驱动:设备枚举