当前位置: 首页 > 知识库问答 >
问题:

JShell的限制是什么?

金钧
2023-03-14

我发现这个问题和另一个问题非常有趣,至少对我来说,它引出了几个问题:

这是一个相当开放的问题,jshell局限于哪里?显然,GUI应用程序不适用于jshell解决方案或IDE替换:

图形界面和调试器支持超出了范围。JShell API旨在允许在IDE和其他工具中使用JShell功能,但JShell工具并不打算成为IDE。

维恩图或其他视觉效果的加分。

当然,代码片段的大小应该受到限制。我更多的是问什么样的问题不能用片段来解决。

另见:

https://openjdk.java.net/jeps/222

https://openjdk.java.net/jeps/330

共有2个答案

壤驷子安
2023-03-14

当然,就IDE和图形用户界面所能提供的范围而言,它仅限于一个普通的REPL实用程序。与单一源代码程序相比,我将更多地谈论它的功能。使其与单一源代码程序保持距离的功能:

  • 有编辑的历史
  • 制表完成
  • 自动添加所需的终端分号和
  • 可配置的预定义导入和定义

正如单文件源代码程序JEP的替代方案中所述:

我们可以将“一次性运行”任务委托给jshell工具。虽然这一点一开始似乎很明显,但在jshell的设计中,这是一个明确的非目标。

jshell工具被设计成一个交互式shell,许多设计决策都是为了提供更好的交互体验。

给它增加作为批处理运行者的额外限制会减损交互式体验。

另一方面,在使用JShell进行实际操作而不是简单地阅读文档时,很少会发现以下限制(假定功能):

>

  • 最终变量的使用最终变量在jshell中运行不正常

    当然,使用JShell进行调试

    在Intellij IDEA中集成jshell与IDEs Java 11 jshell

    禁用历史记录禁用JShell历史记录

    重新声明的变量应该重置在jshell 11中,为什么重置为空的重新声明的引用变量仍然具有类型?

    使用jshell创建模块在Java9的jshell中创建模块

    导入私有包类将包私有类导入JShell

    对象范围在JShell中访问“父范围”

    清除jshell控制台如何清除Java 9 jshell控制台?

    更多详细信息,请参阅使其在单文件源代码程序中占据上风的链接:

    >

  • 为什么以及如何使用JShell?

    在JShell中为项目导入类路径,如何从Maven项目导入类路径

    通过JShell运行应用程序如何使用JShell运行java应用程序?

    设置自定义反馈模式在jshell中创建自定义反馈模式

    启动时加载脚本在jshell启动时加载脚本的不同方式

    列出活动方法列出jshell中的所有活动方法

    运行jshell文件如何运行jshell文件?

    使用jshell执行javascript如何使用jshell执行java脚本?

    如何在jshell中使用方法引用有没有办法在jshell中为顶级函数使用方法引用?

  • 华涵意
    2023-03-14

    回答最新问题

    所有问题都可以通过代码片段(以及足够复杂的shell脚本)来解决。但是JShell最好用于调试和学习java——一个成熟的程序对于所有其他用例来说都更灵活。

    jsh和java MyClass.java

    JShell是一个用于测试java代码的交互式shell。本质上,它是Java的REPL。

    由于JShell的全部功能是输入代码片段,然后对其进行计算,而且通常将这些片段放入文件中而不是多次写入,因此JShell支持。jsh脚本,其中包含要由JShell解释的代码段集合。从这个意义上讲,这类似于bash接受。sh文件或命令。com接受。bat文件——逐行输入它们相当于导入它们。

    单源java文件执行是一个非常不同的野兽。从JDK 11开始,糖取代了,

    java MyClass.java arg1 arg2 arg3
    

    通过本地脚本编写,相当于编写

    TMPDIR=$(mktemp -d)
    javac -d $TMPDIR MyClass.java
    java -cp $TMPDIR MyClass arg1 arg2 arg3
    rm -rf $TMPDIR
    

    这使得单个源代码文件可以通过单个命令从命令行快速执行,并且不需要将它们的编译类到处都是(不需要创建实际的临时目录,因为java可以将这些类存储在内存中)。因为在java中已经有了3种其他的执行模式(用于类、jar文件和模块),所以把它作为第四种模式添加进来就没什么大不了的了。

    Java脚本语言

    既然区别已经很清楚了(. jsh用于JShell,单源代码java可执行文件仅用于,你猜对了,单源代码java可执行文件),那么使用Java作为脚本语言呢?

    您总是可以选择编写启动器;例如,

     #!/bin/bash
     java -jar MyApp.jar
    

    已经工作了很长时间。从技术上讲,可以直接命名一个类,但不太有用,因为在分发二进制文件时,jar文件要方便得多——首先,它们避免将包结构镜像为一堆文件夹。然而,将启动器脚本与实际的java代码分开仍然有点不友好:现在需要将两者放在一起,或者至少让启动器能够定位实际的java代码。罐子要发射了。

    现在,他们还引入了以下快捷方式:无论文件名或扩展名如何,都可以使用“shebang前缀”分发java源代码,如下所示:

    #!/path/to/java --source 11
    <source of MyClass.java>
    

    将其标记为可执行文件,并从命令行启动它,就像您可以启动任何其他可执行文件一样。例如,将其复制并粘贴到一个helloworld文件中(并在尝试运行之前修复jdk位置):

    #!/opt/jdk-11.0.1/bin/java --source 11 
    public class Test {
        public static void main(String ... args) {
            System.out.println("Hello " + (args.length == 0 ? "world!" : args[0]));
        }
    }
    

    在将其标记为可执行文件后,可以使用

    $ ./helloworld
    Hello world!
    

    它甚至正确地阐述了自己的论点:

    $ ./helloworld Bob!
    Hello bob!
    

    对于小型程序,如果您不需要走出JDK来引入其他库,那么现在分发用于命令行使用的java代码将非常容易。

    Java仍然不是一种“脚本语言”(它永远不会与python竞争),但

    • 它有一个非常好的REPL循环
    • 你可以更容易地执行短程序
     类似资料:
    • 本文向大家介绍Web Worker线程的限制是什么?相关面试题,主要包含被问及Web Worker线程的限制是什么?时的应答技巧和注意事项,需要的朋友参考一下 (1)同源限制 分配给 Worker 线程运行的脚本文件,必须与主线程的脚本文件同源。 (2)DOM 限制 Worker 线程所在的全局对象,与主线程不一样,无法读取主线程所在网页的 DOM 对象,也无法使用document、window、

    • 本文向大家介绍document.domain的作用是什么?它有什么限制?相关面试题,主要包含被问及document.domain的作用是什么?它有什么限制?时的应答技巧和注意事项,需要的朋友参考一下 document.domain 能够实现部分情况下的跨域访问的问题。 两个域名必须属于同一个基础域名!而且所用的协议,端口都要一致 (端口可以在两个页面都设置domain,将端口重置为null 来实现

    • 问题内容: 这个问题已经在这里有了答案 : BigInteger是否有上限?[重复] (3个答案) 没有限制的BigInteger是什么意思? (4个答案) 7年前关闭。 我在程序中将两个非常大的BigIntegervalues相乘。失败了 和的限制是什么? 问题答案: 您不会将NumberFormatException与大数字相乘。如果生成的数字太大,则在数组大小溢出时,您将得到一个神秘的Neg

    • 基于上面的代码--我能期望发生什么?我在运行时会因为Horse没有实现add(Animal)而失败吗?在上述性质的调用中,被比较的值的编译时类型是动物的(至少,正如所写的那样),但它们的运行时类型更具体,它能准确地区分它们吗?如果我们使用var而不是val,这有什么改变吗? 提前道谢。 编辑:修改的核心代码--我看到了第一个响应者强调的问题,我没有正确地思考。显然,我还没有真正编译这个,我仍然是在

    • 问题内容: 我的应用程序的用户尝试使用我的应用程序将文件作为电子邮件附件发送。但是,这样做会引发以下异常,我无法解读 什么是“软私有内存限制”?有什么可能导致此异常? 问题答案: “软专用内存限制”是App Engine将停止实例接收任何更多请求,等待任何未完成的请求并终止该实例的内存限制。当您使用过多内存时,可以将其视为正常关机。 偶尔达到软限制是可以的,因为您的所有请求均已完成。但是,每次发生

    • 问题内容: SQL中BIGINT字段类型的限制是什么? 100000235882380或100000466411115是否可以接受?(这是来自Facebook的ID) 问题答案: 查看所使用的RDBMS的手册。并非在所有系统中都相同。 MySQL:https: //dev.mysql.com/doc/refman/5.7/en/integer- types.html PostgreSQL:http