NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

JavaOne 2016——观众得以一睹 JShell 的威力

  • 2016-09-26
  • 本文字数:1950 字

    阅读完需:约 6 分钟

在 JavaOne 2016 的主题演讲中,Java 平台组的首席架构师 Mark Reinhold 指出 Java 9 并不仅仅是 Jigsaw,针对 Java 9,一共包含了 85 个 JEP 。我在这里会关注一个他所强调的 Java 新特性, JEP 222 ,那就是 Java shell(也被称为 JShell)。

借助 JShell,Java 9 能够让开发人员使用 REPL(Read-Eval-Print loop),这是一个交互式的工具,它会计算用户的输入并打印输出,输出的内容要么是一个值要么是一个状态变更。

JShell 是什么?

JShell 是一个 API 和工具,它能够帮助计算代码片段的值。代码片段必须要遵循 Java 语言规范(Java Language Specification,JLS)的语法。JShell 也能够执行查询和命令。命令和片段的区别在于,命令要以一个斜线开头,可以参考如下的样例:

复制代码
jshell> /import
| import java.util.*
| import java.io.*
| import java.math.*
| import java.net.*
| import java.util.concurrent.*
| import java.util.prefs.*
| import java.util.regex.*

JShell 状态其实是模仿了一个 JVM 实例。JShell 会借助编译器 API(Compiler API)来进行代码分析、tab 代码补全和原始代码片段的解析,它使用 Java 调试接口(Java Debug Interface,JDI)实现了代码替换功能。

如果用户不喜欢交互式界面的话,还可以使用批量脚本。

JavaOne 上展现的 JShell 样例

在介绍 Reinhold JavaOne 上的样例之前,我想要补充一句,如果你使用最新版本的 Java 9 SDK 并输入java –version的话,那么会发现现在的版本号字符串会有所变更,如下所示:

复制代码
$ java -version
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+136)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+136, mixed mode)

我们可以与旧的格式进行对比:

复制代码
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

这种变更是由 JEP 223 所引入的新模式带来的。目前的版本字符串更易于解析,并且更符合当前行业实践所强调的语义化版本(Semantic Versioning)。这种新的模式能够帮助我们更容易地识别主版本(major)、小版本(minor)或安全升级的发布版本。

在上面的样例中,预发布识别符( ea——读作“早期访问”)前面会有一个“-”,紧接着是一个“+”号,随后是这次构建所对应的构建号(136)。

回到样例上来,如果你在命令行输入“jshell”的话,将会看到如下所示的 JShell 提示:

复制代码
$ jshell
| Welcome to JShell -- Version 9-ea
| For an introduction type: /help intro
jshell>

如果你输入一个像下面这样的简单 String 声明,就能看到所有可调用的方法(包括重载的方法):

复制代码
jshell> String x = "foo bar baz"
x ==> "foo bar baz"
jshell> x.
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(
jshell> x.substring(4,7)
$3 ==> "bar"
jshell> Arrays.asList(x.split(""))
$5 ==> [f, o, o, , b, a, r, , b, a, z]
jshell> Arrays.asList(x.split(" "))
$6 ==> [foo, bar, baz]

上面的样例展现了临时变量($3、$5 和 $6),如果需要的话,它们可以用于后续表达式的计算。

复制代码
jshell> import java.util.stream.*
jshell> $6.stream().filter(s -> s.startsWith("b")).collect(Collectors.toList())
$9 ==> [bar, baz]

在上例中,我们导入了java.util.stream包,这样的话,在 Collectors 类上进行 tab 键提示的时候,就能得到它的方法列表。

结论

JShell 为 Java 带来了 REPL,在经典的 LISP 机器上,这是一项非常有用的特性。它能够帮助开发人员调试代码片段,避免了完整的编译、运行和调试流程。

查看英文原文 JavaOne 2016 – Audience Gets a Glimpse of the Power of JShell

2016-09-26 19:004064

评论

发布
暂无评论
发现更多内容

5 个最值得注意的开源集中式日志管理工具

程序员石磊

Linux 日志 性能监控 日志监控

解读|2020年CNCF云原生调研报告

焱融科技

容器 云原生 存储 cncf

C/C++后台开发需要点亮哪些技能树||(鹅厂为例) Linux百里

赖猫

c++ Linux 后台开发 linux开发 服务器开发

大厂面试算法到底有多重要?学会这份算法宝典,随便暴打头条面试官!

Java架构之路

Java 程序员 架构 面试 编程语言

硬盘的秘密

yes

机械硬盘

LeetCode题解:69. x 的平方根,牛顿迭代法+递归,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

Linux-Lab 入门:详细步骤分解

贾献华

Linux 嵌入式 Linux Kenel 开发板 boot

深入理解JVM中的类加载机制

Simon郎

JVM

android开发实战!面试的时候突然遇到答不上的问题怎么办?Android校招面试指南

欢喜学安卓

android 程序员 面试 移动开发

非科班Java面试快手三面,如果不是疫情,offer已经到手了

Java架构之路

Java 程序员 架构 面试 编程语言

【盘点2020】连续8个月霸榜,年度最佳公有云竟然是它?

博睿数据

拆散的乐高怎么装起来

李小腾

官宣 | Atlassian 针对中国市场推出适用于所有团队的本地化部署方案!

Atlassian

项目管理 DevOps 敏捷 Atlassian Jira

你需要的Docker知识点都在这里了。

后台技术汇

28天写作 2月春节不断更

webpack | 进阶用法4:如何进行构建速度和体积分析

梁龙先森

大前端 webpack 28天写作 2月春节不断更

黄际洲获CCF优秀博士学位论文奖 搜索推荐技术创新成果显著

爱极客侠

SpringCloud 从入门到精通17---Sentinel降级/热点规则

Felix

收购环信、因Clubhouse股价飙升30%,

ToB行业头条

SpringBoot 接口幂等性的实现

xcbeyond

Spring Boot Java、 幂等性 28天写作

盘点软件开发中那些有趣的边际效应

架构精进之路

认知提升 七日更 28天写作 2月春节不断更

怎么和小伙伴语音连麦,你造吗?

anyRTC开发者

ios android WebRTC sdk 语音通话

资本市场发展趋势学习笔记

JiangX

28天写作

官宣|焱融科技完成1.2亿元A+轮融资

焱融科技

分布式 存储 焱融科技 企业融资 创业公司

备战金三银四,”吊打各厂面试官“ ,为你准备了这份堪称“神作”的Java面试宝典

Java架构之路

Java 程序员 架构 面试 编程语言

学习感恩

谷鱼

京东扫描平台EOS—JS扫描落地与实践

京东科技开发者

大前端

混合云的五个优势

浪潮云

混合云

android开发手册apk!Android开发者跳槽指南终获offer

欢喜学安卓

android 程序员 面试 移动开发

带你了解TCP/IP,UDP,Socket之间关系

赖猫

socket udp TCP/IP

DCache 分布式存储系统|Key-Value 缓存模块的创建与使用

TARS基金会

nosql 微服务 MySQL 高可用 分布式数据储存 TARS

高并发高性能服务器是如何实现的?

赖猫

c++ 高并发 linux开发 服务器开发 多线程高并发

JavaOne 2016——观众得以一睹JShell的威力_Java_Monica Beckwith_InfoQ精选文章