当前位置: 首页 > news >正文

JShell:Java REPL综合指南

\

本文要点

\\
  • Java Shell或JShell是官方提供的读取-求值-打印-循环,通常称为REPL,是在Java 9中引入的。\\t
  • JShell提供了一个交互式shell,用于快速原型、调试、学习Java及Java API,所有这些都不需要public static void main方法,也不需要在执行之前编译代码。\\t
  • 随着Java 10引入了“var”关键词,JShell简单了许多(而且更实用了)。\\t
  • 本文将对JShell做一个全面的介绍,了解它所有的命令、用法以及它最有效的使用方法。\\t
  • JShell非常适合提供中间反馈。它看上去可能没什么大不了的,但是,所有这些小事情(如在IDE中编译或运行单元测试)会随着时间推移慢慢积累。\
\\

JShell是什么?

\\

Java Shell或JShell是官方提供的读取-求值-打印-循环,通常称为REPL,是在Java 9中引入的。它提供了一个交互式shell,用于快速原型、调试、学习Java及Java API,所有这些都不需要public static void main方法,也不需要在执行之前编译代码。此外,随着Java 10引入了var关键词,JShell简单了许多(而且更实用了)。

\\

入门

\\

注意:在这份指南中,为了使用关键词var,我们将使用Java 10,因此,为了跟着这份指南操作,你务必要确保至少已经安装了Java 10。

\\

JShell的启动很容易,在命令行输入jshell即可。你会看到一条欢迎信息,而shell会等待你输入命令或任何合法的Java表达式。

\\
\$ jshell\|  Welcome to JShell -- Version 10.0.2\|  For an introduction type: /help intro
\\

让我们执行第一条命令。在shell提示符下,输入var greeting = \"hello\",按下\u0026lt;enter\u0026gt;。你会看到下面的输出:

\\
\jshell\u0026gt; var greeting = \"hello\"\greeting ==\u0026gt; \"hello\"
\\

你会注意到,它回显了greeting的值,确认当前值为hello。你可能还会注意到,你的表达式不需要分号。这是一个小而漂亮的特性!

\\

为了完成我们的问候语,我们需要的一位听众。输入var audience =并按下\u0026lt;enter\u0026gt;。这次,JShell认识到,你的表达式不完整,并允许你在下一行继续输入。输入\"world\"并按下\u0026lt;enter\u0026gt;完成表达式。和前面一样,JShell会回显确认已设置的值。

\\
\jshell\u0026gt; var audience =\  ...\u0026gt; \"world\"\audience ==\u0026gt; \"world\"
\\

Tab补全

\\

你首先注意到的其中一件事情是,它完美集成了tab补全。

\\

让我们把字符串greeting和audience串联起来,组成一个新变量saying。先输入var saying = gr,然后按下\u0026lt;tab\u0026gt;。你会看到,变量greeting自动补全了。用同样的方法输入变量audience,按下\u0026lt;enter\u0026gt;,就可以看到串联结果了。

\\
\jshell\u0026gt; var saying = gr\u0026lt;tab\u0026gt; + aud\u0026lt;tab\u0026gt;\saying ==\u0026gt; \"helloworld\"
\\

Tab补全就和你预想的一样,自动补全唯一值或者在不确定时提供可能的值。它对之前输入的任何表达式、对象和方法均有效。注意,它对内置关键词无效。

\\

如果你想要把变量saying变成大写,但是又没记住方法的具体名称,那么你只要输入saying.to,然后按下\u0026lt;tab\u0026gt;,就可以看到所有以to开头的所有有效方法了。

\\
\jshell\u0026gt; saying.to\u0026lt;tab\u0026gt;\toCharArray()   toLowerCase( toString()      toUpperCase(
\\

可能有参数的方法显示时使用开括号,而没有参数的方法显示时使用闭括号。

\\

错误

\\

如果你不小心犯了个错误或者输入了一个非法表达式、方法或命令,那么JShell会立即反馈,显示错误,标注问题。

\\
\jshell\u0026gt; saying.subString(0,1)\|  Error:\|  cannot find symbol\|    symbol:   method subString(int,int)\|  saying.subString(0,1)\|  ^--------------^
\\

方法签名

\\

让我们调用toUpperCase方法,但推迟添加任何额外的参数,或者以一个圆括号结束。再次按下\u0026lt;tab\u0026gt;。这次,你会看到toUpperCase方法所有可用的方法签名;一个有一个Locale参数,另一个没有任何参数。

\\
\jshell\u0026gt; saying.toUpperCase(\Signatures:\String String.toUpperCase(Locale locale)\String String.toUpperCase()\\\u0026lt;press tab again to see documentation\u0026gt;
\\

文档(JavaDoc)

\\

如果你第三次按下\u0026lt;tab\u0026gt;,你就会看到toUpperCase(Locale)方法的JavaDoc文档。

\\
\jshell\u0026gt; saying.toUpperCase(\String String.toUpperCase(Locale locale)\Converts all of the characters in this String to upper case ... (shortened for brevity)
\\

继续按下\u0026lt;tab\u0026gt;,就可以依次查看所有可用的方法签名及其相关文档。

\\

导入

\\

让我们把这个例子扩展到其他的听众,如Universe和Galaxy,而不仅仅是hello world。首先创建一个名为audiences的列表,其中有三个不同的听众:world、universe、galaxy。使用List构造函数和Java 9提供的静态工厂方法,只需要一行代码即可实现。

\\
\jshell\u0026gt; var audiences = new ArrayList\u0026lt;\u0026gt;(List.of(\"world\

相关文章:

  • Logstash 参考指南(目录)
  • 通过shell脚本检测MySQL服务信息
  • 【leetcode】53. 最大子序和(Maximum Subarray)
  • Percona-xtrabackup 使用详解与原理
  • 大数据——基础概念
  • 用户数量高达3人的分布式系统
  • 多研究些架构,少谈些框架——一名阿里架构师的笔记
  • 深入浅出Node.js
  • unix下命令窗分屏工具
  • linux防火墙操作随笔记录
  • CF1060E Sergey and Subway(点分治)
  • CentOS 7更改yum源与更新系统
  • Python基本数据类型集合、格式化、函数
  • 印章与合同管理一体化:杜绝实体印章与纸质合同隐患
  • 微软正式发布Azure Functions 2.0
  • ECS应用管理最佳实践
  • HTTP 简介
  • JavaScript服务器推送技术之 WebSocket
  • k8s 面向应用开发者的基础命令
  • Less 日常用法
  • Lsb图片隐写
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • React的组件模式
  • 二维平面内的碰撞检测【一】
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 深入 Nginx 之配置篇
  • 实战|智能家居行业移动应用性能分析
  • 小程序测试方案初探
  • Nginx实现动静分离
  • 阿里云ACE认证之理解CDN技术
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • # Java NIO(一)FileChannel
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • $jQuery 重写Alert样式方法
  • (C#)一个最简单的链表类
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (多级缓存)缓存同步
  • (二)斐波那契Fabonacci函数
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (过滤器)Filter和(监听器)listener
  • (十一)c52学习之旅-动态数码管
  • .libPaths()设置包加载目录
  • .NET Micro Framework初体验
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net 无限分类
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net流程开发平台的一些难点(1)
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [C++]类和对象【下】
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [codevs] 1029 遍历问题
  • [DL]深度学习_Feature Pyramid Network
  • [HTML]Web前端开发技术6(HTML5、CSS3、JavaScript )DIV与SPAN,盒模型,Overflow——喵喵画网页