【问题标题】:Is there something like python's interactive REPL mode, but for Java?有没有类似 python 的交互式 REPL 模式,但对于 Java ?
【发布时间】:2010-09-28 16:33:17
【问题描述】:

有没有类似于 python 的交互式 REPL 模式,但对于 Java? 这样我就可以,例如,在窗口中输入InetAddress.getAllByName( localHostName ),并立即获得结果,而无需所有这些 public static void nightmare() 东西?

【问题讨论】:

标签: java read-eval-print-loop


【解决方案1】:

编辑 从 Java 9 开始有 JShell

原答案如下

您也可以使用Groovy Console。它是一个交互式控制台,您可以在其中做您想做的事。由于 Groovy 还包含来自核心 Java 平台的类,因此您也可以使用这些类。

看起来像这样:

【讨论】:

  • 截图不再存在于 imageshack 上。
  • groovy 控制台特别好的地方在于默认导入了更多的包(例如 java.util.*),因此您不需要编写那么多导入语句
  • 对于那些懒得安装 Groovy 的人,这里有这个控制台的在线版本:groovyconsole.appspot.com。一些 JDK 库不可用(例如 I/O 和 System.exit()),但对于大多数用途来说应该足够了。
  • 这个不接班正常吗? class test{public static void test(){System.out.println('test')}}
【解决方案2】:

Eclipse 具有执行此操作的功能,尽管它不是循环。它被称为“剪贴簿页面”。我假设这个类比应该是你有一本剪贴簿,你可以在其中收集少量的 sn-ps 代码。

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

然后:

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

现在您有一个剪贴簿页面。输入一些代码,可能是这样的:

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

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

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

【讨论】:

  • 谢谢。 Beanshell 对我来说已经超时了,但这很有效。
  • 我用Eclipse这么久了,一直不知道,谢谢!
【解决方案3】:

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,可以减少冗长的语法。
  • BeanShell 被积极维护为 beanshell 2 - code.google.com/p/beanshell2
  • 从命令行运行beanshell的简单例子can be found here
  • @hshib:现在在Github,最后一次提交是从 2013 年开始的。那 不是“积极维护”。
  • @MartinSchröder,该评论是在 2013 年 :-)
【解决方案4】:

您可以使用 Eclipse 剪贴簿页面。

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

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

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

【讨论】:

  • 虽然有用,但剪贴簿页面不是持久会话,因此作为 REPL 并不能很好地工作。
【解决方案5】:

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

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

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

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

【讨论】:

【解决方案6】:

似乎还没有人提到 Java (6, 7) 发布了一个名为 jrunscript 的 REPL 控制台。它与语言无关(因此可以与 Jython、JRuby 等一起使用)。它默认为默认捆绑的 JavaScript (Rhino),并且与其他语言一样,您可以访问类路径中所有可用的包/对象。

【讨论】:

    【解决方案7】:

    它是 OpenJDK 9 的一部分!

    一个名为 JShell(由 Oracle 开发)的 REPL 已作为 JDK 9 的一部分发布。

    只需下载 JDK 9,然后启动 bin/jshell

    资源

    【讨论】:

      【解决方案8】:

      作为 Groovy 的替代品,试试 Beanshell:http://www.beanshell.org/

      它更像 Java,允许您直接使用 Java 语法。

      【讨论】:

      • beanshell 不再维护了吗?
      • BeanShell 被积极维护为 beanshell 2 - code.google.com/p/beanshell2
      • @hshib:没有。github 上的最后一次提交是从 2013 年开始的。
      【解决方案9】:

      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])
      

      【讨论】:

        【解决方案10】:

        Albert Latacz 的 Java-REPL 运行良好。

        您可以在此处直接从浏览器尝试: http://www.javarepl.com/term.html

        这里有源代码,它有一个不错的 Intelli-J 插件。

        https://github.com/albertlatacz/java-repl

        【讨论】:

          【解决方案11】:

          Clojure 提供了一个可以使用的 REPL。

          【讨论】:

            【解决方案12】:

            groovy console 允许您这样做。它实际上是为了尝试和测试 groovy 代码,但由于 groovy 是 Java 的超集,它也允许使用普通的 Java 代码。

            我刚刚在控制台中输入了这个:

            InetAddress.getAllByName('localhost')
            

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

            groovy> InetAddress.getAllByName('localhost')
            
            Result: [localhost/127.0.0.1]
            

            【讨论】:

              【解决方案13】:

              Scala 还提供交互式控制台。通过完全限定 InetAddress,我能够使用它来获得问题中表达式的结果,如下所示:

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

              【讨论】:

                【解决方案14】:

                虽然JRubyBeanShellJulian Fleischer's REPLAlbert Latacz's 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);
                

                【讨论】:

                  【解决方案15】:

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

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

                  按 Shift-Enter 进行评估,你得到 ​​p>

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

                  然后你可以使用 Mathematica 的 Map 函数在返回的对象上调用toString

                  #@toString[]& /@ %
                  

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

                  {"localhost/127.0.0.1"}
                  

                  如果你开始认真对待这个问题,你会想要阅读 Todd Gayley 在http://reference.wolfram.com/mathematica/JLink/tutorial/Overview.html 上的教程。

                  【讨论】:

                    【解决方案16】:

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

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

                    从 shell 中加载其他 jars。

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

                    【讨论】:

                    • 我知道我可以使用 groovy shell,但是 Groovy 没有与 Java 完全相同的语义,并且没有类型检查。因此,我可能会遇到编译错误,或者使用一段似乎可以在 Groovy shell 中工作的 Java 代码出现不同的运行时行为。
                    • groovy 还将加载 ~/.groovy/lib 中的所有库,您可以在其中复制内容或使用符号链接
                    【解决方案17】:

                    您可以使用 jruby http://kenai.com/projects/jruby/pages/CallingJavaFromJRuby 编写 java 脚本

                    【讨论】:

                      【解决方案18】:
                      【解决方案19】:

                      大多数 IDE 都有一个类似于“立即模式”的窗口,可让您即时评估 Java 代码。

                      【讨论】:

                      • Eclipse 的“显示”视图接近我想要的。问题是,它必须在运行应用程序的上下文中。我必须运行一个应用程序,在断点处停止,然后我才能输入我想要的内容。
                      • @YoniRoit 恕我直言,我更喜欢“显示”+调试模式,而不是命令行 REPL。很久以前我曾经使用 REPL w/Python,所以我都做了。我认为编写一个单元测试并放置一个断点并使用所需的上下文要好得多,同时将任何代码粘贴回单元测试中。在普通的 REPL 中获得准确的上下文比说单元测试要困难得多。
                      【解决方案20】:

                      您可以查看BlueJ,这是一个交互式 Java 开发环境,用于教授 OOP,而不是像 Eclipse 或 NetBeans 那样的完整 IDE。不管怎样,玩起来还是很有趣的。

                      您可以在 YouTube 的一系列 Java 教程中看到它的实际应用。

                      【讨论】:

                      • 这很有趣。 Bluej 就像一个 op repl。对于您当前使用 repl 的事情来说并不是很有用,但您可以使用它来对您的 oo 设计进行原型设计,就像您使用 repl 对方法进行原型设计一样。
                      【解决方案21】:

                      DrJava 是一个包含 REPL 窗格的教育 IDE。

                      还有一个 Eclipse 插件,但它对我不起作用。我想它只是有一段时间没有更新了。所以我通常会为“如果我这样做会发生什么”问题打开一个 DrJava 窗口。

                      EclipseShell 可能也不错,但我还没用过。

                      【讨论】:

                        【解决方案22】:

                        【讨论】:

                        • 未维护。
                        【解决方案23】:

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

                        【讨论】:

                          【解决方案24】:

                          有一个在线REPL:http://www.javarepl.com/console.html

                          键入更多以达到字符限制...

                          【讨论】:

                            【解决方案25】:

                            对于 java 8,有 nudge4j。 见https://github.com/lorenzoongithub/nudge4j

                            ...美妙之处在于您可以从浏览器中试运行您的应用程序t

                            【讨论】:

                              【解决方案26】:

                              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>
                              

                              它还可以转储集合、列表、地图等,并允许将它们呈现为表格或图表:

                              【讨论】:

                                【解决方案27】:

                                Java 9 提供了 JShell。

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

                                【讨论】:

                                  【解决方案28】:

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

                                  我为 Jython 使用了 InteractiveConsole,它在应用程序中运行良好。

                                  【讨论】:

                                    【解决方案29】:

                                    自 2018 年 9 月发布的 JDK 11 以来,java 命令允许启动单个 java 源代码文件。请参阅错误报告 8192920JEP 330

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 2010-10-21
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2012-07-19
                                      • 1970-01-01
                                      • 2011-06-22
                                      • 2011-08-01
                                      相关资源
                                      最近更新 更多