是否有类似python的交互式REPL模式的功能,但适用于Java?


92

是否有类似python的交互式REPL模式的功能,但适用于Java?这样一来,例如,我可以键入InetAddress.getAllByName( localHostName )一个窗口并立即获得结果,而无需所有这些公共的static void nightmare()事情?



3
Java在JDK-9中对其进行介绍:JEP 222:jshell:Java Shell
不是错误

Answers:


64

编辑 由于Java 9有JShell

原始答案如下

您也可以使用Groovy Console。它是一个交互式控制台,您可以在其中进行所需的操作。由于Groovy还包括来自核心Java平台的类,因此您也可以使用这些类。

看起来像这样:

Groovy的屏幕截图


屏幕快照不再存在于imageshack上。

什么是特别好的关于常规控制台是多了很多包默认情况下进口的,所以你不需要写那么多的import语句(如java.util中。*)
多纳尔

2
对于那些懒于安装Groovy的用户,可以在此处找到此控制台的在线版本:groovyconsole.appspot.com。某些JDK库不可用(例如I / O和 System.exit()),但对于大多数目的,它应该足够了。
2013年

这样不接受类是正常的吗?class test{public static void test(){System.out.println('test')}}
青柠

52

Eclipse具有执行此操作的功能,尽管这不是循环。它称为“剪贴簿页面”。我以此类推,假设您有一本剪贴簿,其中收集了一些代码片段。

无论如何,要使其工作,请在Eclipse中打开一个项目(您的Scrapbook页面将与一个项目相关联-当项目拥有东西时,Eclipse会喜欢它)。

然后:

  1. 在项目浏览器窗口中,选择项目中某个位置存在的文件夹。
  2. 选择菜单文件->新建->其他,或按Control-N。
  3. 选择Java-> Java运行/调试->剪贴簿页面。
  4. 点击“下一步”,然后给它一个文件名,然后点击“完成”。

现在您有一个剪贴簿页面。输入一些代码,例如:

System.out.println(System.getProperties());

然后用鼠标选择文本,然后按Control-U或从上下文菜单中选择“执行”。代码将运行,并且输出将出现在控制台上。

您也可以键入一个表达式,选择它,然后从上下文菜单中选择“显示”。它将评估表达式并打印其类型。例如,运行Display on 1 + 2将打印(int) 3


1
感谢那。Beanshell对我来说是超时,但这很正常。
Bayard Randel

3
我已经使用Eclipse很久了,但是对此一无所知,谢谢!
Tobold 2012年

28

BeanShell是一个小型的,免费的,可嵌入的Java源解释器,具有使用Java编写的对象脚本语言功能。BeanShell动态执行标准Java语法,并使用常见的脚本编写便利进行扩展,例如松散类型,命令和方法闭包(如Perl和JavaScript)。您可以交互地使用BeanShell进行Java实验和调试,以及以新方式扩展应用程序。脚本Java适用于各种应用程序,包括快速原型制作,用户脚本扩展,规则引擎,配置,测试,动态部署,嵌入式系统,甚至Java教育。

http://www.beanshell.org/

http://www.beanshell.org/manual/syntax.html#Standard_Java_Syntax


还有Jython和JRuby交互式shell,用于较少冗长的语法。
bakkal 2010年

1
BeanShell的积极保持为BeanShell的2 - code.google.com/p/beanshell2
hshib

从命令行运行beanshell的一个简单示例可以在此处找到
Brad Parks

@hshib:现在在Github上一次提交是在2013年。那不是 “积极维护”。
MartinSchröder'17

@MartinSchröder,该评论在2013年出现:-)
hshib

19

您可以使用Eclipse Scrapbook页面。

在Eclipse中创建一个Scrapbook页面。在您的项目中,新建->其他->剪贴簿页面。

在文件中,输入一些文本,将其选中并按ctrl-U,然后就可以了。

要管理导入,请在页面中右键单击并选择“设置导入”,您可以在其中选择导入软件包或单个类。这是持久性的,并与页面一起保存。


3
剪贴簿页面可能不是有用的,它不是持久会话,因此作为REPL不能很好地工作。
MHarris

19

旧问题,但是现在有一个更好的答案(2013年5月)-java-REPL!它可以在github上获得,也可以在java-repl网站上实时获得,以进行一次性测试。

如果获取git hub代码并运行ant以生成工件,则可以使用以下小脚本轻松使用它:

#!/bin/sh
java -jar /home/rdahlgren/scripts/javarepl-dev.build.jar

自从找到这个项目以来,我可能每天使用5次。请享用!


现在,在线代表的链接似乎是javarepl.com/term.html。旧的链接仅显示Java错误。
托尼

13

似乎没有人提到Java(6,7)附带了一个称为的REPL控制台jrunscript。它与语言无关(因此可以与Jython,JRuby等一起使用)。它默认为JavaScript(Rhino),默认情况下也捆绑了该语言,并且像其他语言一样,您可以访问类路径上可用的所有包/对象。




11

Jython是一个python实现,可让您检查Java对象并与之交互。

>>> from java.net import *
>>> InetAddress.getAllByName("google.com")
array(java.net.InetAddress,[google.com/209.85.171.100, 
                            google.com/74.125.45.100,
                            google.com/74.125.67.100])



7

常规控制台可以让你做到这一点。它实际上是用来尝试测试groovy代码的,但是由于groovy是Java的超集,因此它也允许使用普通的Java东西。

我刚刚将此输入到控制台中:

InetAddress.getAllByName('localhost')

然后按CTRL-R,然后返回:

groovy> InetAddress.getAllByName('localhost')

Result: [localhost/127.0.0.1]

7

Scala还提供了一个交互式控制台。通过完全限定InetAddress,我可以使用它来获取问题表达式的结果,如下所示:

java.net.InetAddress.getAllByName("localhost")

6

虽然JRubyBeanShell朱利安·弗莱舍(Julian Fleischer)的REPL在那里,阿尔伯特·拉塔兹(Albert Latacz)的REPL似乎是最新的且活跃的。

使用简单的类定义进行了尝试,效果很好。

$ java -jar javarepl.jar
Welcome to JavaREPL version 56 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_17)
Type in expression to evaluate.
Type :help for more options.

java> public class Test {
    | public static void execute(String [] s) {
    |  System.out.println(54353 + s[0]);
    | }}

java> Test.execute(new String [] {"234343"});
54353234343

java> System.exit(0);

3

对于可以访问Mathematica的人们,JLink允许您使用Mathematica代码访问Java和脚本:

Needs["JLink`"]
LoadJavaClass["java.net.InetAddress"]
InetAddress`getAllByName["localhost"]

按Shift-Enter进行评估,您将获得

{<<JavaObject[java.net.Inet4Address>>}

然后,您可以使用Mathematica的Map函数来调用toString返回的对象:

#@toString[]& /@ %

获取结果(或使用不太晦涩的语法Map[Function[obj, obj@toString[]], %]):

{"localhost/127.0.0.1"}

如果您开始对此感到认真,则需要阅读位于http://reference.wolfram.com/mathematica/JLink/tutorial/Overview.html的 Todd Gayley的教程。


2

如果您已经了解Groovy(假设您已经提到了Groovy Console,那么我想您会知道的),那么只需使用Groovy发行版中包含的groovysh或groovyConsole。如果您有要导入的自定义jar,则可以编写一个批处理文件,以添加到类路径中的那些文件启动groovysh / groovyConsole。您也可以这样做

this.class.classLoader.rootLoader.addURL(new URL("file:///path to file"))

从壳内加载其他罐子。

几年前,我曾经使用Jython来完成您的要求。作为构建脚本的一部分,我生成了一个自定义的jython.bat和.py文件,其中包含我正在处理的项目的完整类路径。这样,当我启动Jython时,它将拥有所有可用的代码,并且它将带动Spring使我能够在实时系统中进行操作。您可以使用Groovy,JRuby,BeanShell等执行相同的操作。


我知道我可以使用groovy shell,但是Groovy的语义与Java不完全相同,并且没有类型检查。因此,可能会有一段似乎可以在Groovy shell中运行的Java代码出现编译错误或不同的运行时行为。
多纳尔

groovy还将在〜/ .groovy / lib中加载所有库,您可以在其中复制内容或使用符号链接
Jason



1

大多数IDE都有一个称为“立即模式”的窗口,该窗口使您可以即时评估Java代码。


Eclipse具有接近我想要的“显示”视图。问题是,它必须在运行应用程序的上下文中。我必须运行一个应用程序,在断点处停止,然后才能键入所需的内容。
Yoni Roit,

@YoniRoit恕我直言,我比命令行REPL更喜欢“显示” +调试模式。我很久以前就使用带有Python的REPL,所以我都做到了。我认为编写一个单元测试并放置一个断点并与所需的上下文一起玩,同时将任何代码粘贴回单元测试中要好得多。在普通的REPL中获得准确的上下文比说单元测试要困难得多。
亚当·根特

1

您可以看一下BlueJ,它是一个交互式Java开发环境,用于教授OOP,而不是像Eclipse或NetBeans这样的完整IDE。无论如何玩是一种乐趣。

您可以通过一系列Java教程在YouTube上看到它的实际效果。


这是有趣的。Bluej就像一个操作员。对于当前使用repl的东西并不是很有用,但是您可以像使用repl来对方法进行原型处理一样,使用它来对oo设计进行原型化。
Bill K

1

DrJava是一个教育性IDE,其中包括一个REPL窗格。

也有一个Eclipse插件,但是它对我没有用。我认为它只是有一段时间没有更新。因此,我通常要做的是打开DrJava窗口,以解决“如果执行此操作会发生什么”问题。

EclipseShell也可能很好,但是我还没有使用过它。



1

有一个名为DrJava的简单IDE ,它具有一个Interactions控制台。它的工作完全符合我的期望。只需加载一个文件并开始与其中的对象进行交互。




1

JPad是具有内置REPL的Java暂存器:

C:\>jpad
       _ _____          _
      | |  __ \        | |
      | | |__) |_ _  __| |
  _   | |  ___/ _` |/ _` |
 | |__| | |  | (_| | (_| |
  \____/|_|   \__,_|\__,_|



Anything you type is evaluated as java.
The code is continuously appended until you call \clear.
Other Available Commands:
\exit - exit
\clear (n) - clear past java statements
\history - display all past java statements
\help - display this help

j>2+2
4
j>Math.sin(100.1)
-0.4177477
j>

在转储集合,列表,地图等方面也很聪明,并允许将它们呈现为表格或图表:

在此处输入图片说明


1

Java 9提供了JShell。

jshell> println( "Print me!")
jshell> Print me!

0

Jython,JRuby的JIRB,Groovy(groovyconsole等)和Beanshell都是可行的选择。

我已经在InteractiveConsoleJython中使用过了,它在应用程序中确实很好用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.