从今天开始如何开始使用Java 9最酷的功能之一?
上周末,我终于开始尝试使用Java 9的早期访问版本了。第一站是JShell,它也被称为Project Kulla。 首先让我鼓起勇气尝试早期访问Java版本的原因。
那就对了。 Java 9的正式发布日期当前设置为2016年9月,但是早期访问版本已经具有功能完整的JShell版本。 它仍在开发中,并且有一些古怪之处,但这从来没有阻止过我们。
新话题:9的Java早期访问:一个动手的Session JShell -该#Java REPL http://t.co/F8cQ9X5dQM pic.twitter.com/JoWR6i8PSz
— Takipi(@takipid) 2015年7月7日
有趣的事实1: Kulla项目是开发JShell的团队的内部名称。 库拉(Kulla)是美索不达米亚神话中的建筑神的名字,他在建筑工作完成后被驱逐。 暗示Kulla用例是一种学习工具吗?
那么,JShell是什么呢?
JShell / Project Kulla是第一个正式的Java REPL(Read-Eval-Print-Loop),这是一个命令行工具,使您可以自己运行Java语句,而不必将它们包装在类或方法中。 与Python的解释器或其他本机支持REPL的其他JVM语言(例如Scala和Groovy)类似。 在Java 9即将发布的功能中,它绝对是更有趣的功能之一。 要查看您附近的JDK即将推出的更多激动人心的功能(除了Project Jigsaw!),您可以阅读有关Java 9的前5个功能的前一篇文章, 这些文章将改变您的编码方式 。 到现在为止,如果您想使用Java进行REPL,则可以使用具有多种语言支持的repl.it之类的替代方案,或者使用非官方的Java REPL项目。 不过,在Java 9中,REPL与langtools软件包一起捆绑在JDK中。
有趣的事实2: 另一个带有神话名称的OpenJDK项目是Valhalla项目。 不仅限于Java 9,还致力于诸如值类型和泛型泛型等功能。 绝对是坏蛋。
但是,够了,让我们启动它,看看它能做什么。 在下面的简短终端编码中,我们将使用JShell v0.61进行快速测试(OSX 10.10.3存在一个已知问题,其中提示与一些输出混合在一起,所以请不要介意,它将可能很快就会解决):
启动并使用JShell
回顾我们刚刚看到的内容:JShell的一些最有趣的功能
** [8/7/2015]更新:使用Oracle Java语言架构师Brian Goetz的注释进行编辑
1.在裸露的语句上分号是可选的
您好JShell! 凭借REPL的快速和灵活特性,我们可以放轻松一些,而不必在声明的末尾添加分号:
实际上,这是我们围绕将来的Java功能进行的一项调查中的一个受欢迎的回答。 当然,分号可以作为终止符或分隔符保留在这里。 REPL允许一次输入裸表达式和语句,因此分号对于Jshell上的终止符用例而言是可选的。
2. REPL网络
使用JShell,我们不仅限于我们的机器 ,还可以访问网络,这带来了一些有趣的机会。 例如,考虑将其用作与服务器通信的终端,远程连接到服务器并从外部控制某些参数。 另一个选择是查询您的数据库,这里的可能性确实是无限的。
3.帮助! 保存和加载工作区
除了运行和评估Java语句外,JShell还支持一系列命令,以帮助您了解和浏览REPL环境。 您可以保存和加载工作区(使Java类似于脚本语言的工作区),然后在执行所有代码后返回命令提示符(实际上您可以在终端记录中看到我提到的OS X错误)。 。
其他有用的命令是列出所有当前可用的变量和方法,查看所有命令历史记录,并列出到目前为止所编写的所有代码(有时仍然有些怪异)。
这是当前可用命令的完整列表:
4.没有检查过的异常
如果您担心被检查的异常会破坏您的REPL体验–不再害怕,那么JShell会在后台为您包装这些异常。 在下面的示例中,迫使我们捕获IOException的原因没有引起注意。 在这里,我们在不处理IOException的情况下读取和打印文件:
我们确实看到弹出一个检查到的异常的情况是,当我们尝试运行线程并在其中使用Thread.sleep()时。 由于它是一个完整的方法,而不是单个裸语句,因此它必须是完全有效的Java:
继续进行一些其他未在终端录制中使用的功能:
5. Java表达式
关于JShell终端的另一件事是,它还可以在其上评估Java表达式。 字符串连接,方法调用,算术等。 基本上,您可以在System.out.println(/ *此处* /)中包装的任何内容。 正如您可能已经在其他评估中注意到的那样,它将立即将结果放入其自己的变量中并打印出来:
6.转发参考
JShell对前向引用提供了相当不错的支持,因此您可以定义引用其他方法或变量的函数,这些方法或变量只会在以后定义。 这是AdoptOpenJDK的REPL教程中的示例:
7. JShell API
除了用作独立的JDK工具外,JShell还将提供一个API,可将其所有功能开放给外部使用。 这意味着外部工具可以连接并使用JShell的功能,并且突然出现了一些有趣的可能性,例如将其包含在Eclipse,IntelliJ或Netbeans等IDE中。 该API更具创造性的用例可能包括使用它来扩展静态分析功能,自动测试甚至可能挂接到实时JVM的工具。
8.随时更改定义
您可以重新声明变量,方法和类,而不必担心原始声明。 完成此操作后,系统会提示您一条消息,让您知道发生了什么,但除此之外–一切照旧。
奖励:您需要的只是爱
如果您深入研究/ repl / samples文件夹,则会发现这个可爱的示例,它将使用Swing吸引您3个小小的心:
如何独自上手?
首先,请查看伦敦Java社区(LJC)的“ 采用OpenJDK:入门工具包”中的说明。 以下是对帮助您起步的步骤的简要概述,尤其是如果您以前从未使用过早期访问JDK版本时,尤其如此:
- 安装Java 9抢先体验JDK
- 构建kulla-dev分支:
hg clone http://hg.openjdk.java.net/kulla/dev kulla-dev cd kulla-dev bash configure –with-boot-jdk=/path/to/jdk1.8.0 make clean images make install <=== optional
- 建立REPL:
cd langtools/repl bash ./scripts/compile.sh
- 并且...现在您可以运行了:
bash ./scripts/run.sh
对于OS X用户的重要说明:在运行compile.sh和run.sh之前,请编辑脚本并将#!/ usr / bin / sh更改为#!/ bin / sh 。
如果您对此过程有任何疑问,请在下面的评论部分中发布它们,我们将竭尽所能。
结论
令人兴奋的是,库拉计划(Project Kulla)越来越接近成熟,它将具有功能完善的状态。 JShell具有广泛的用例,但首先,它将帮助新老开发人员快速测试他们的新技能。 无论是基本的Java还是新的库,您都刚刚开始思考。 而且,JShell使Java与具有这些功能的语言相提并论已有一段时间了,甚至还可以通过正式的API和流畅的命令行体验进一步推动Java的发展。
翻译自: https://www.javacodegeeks.com/2015/07/java-9-early-access-a-hands-on-session-with-jshell-the-java-repl.html