标签: jshell

如何从 shell 或 windows 命令行以内联方式执行 java jshell 命令

有没有办法在 REPL ( jshell) 上执行 java 命令作为内联命令而不启动它?

例如 Perl 内联命令

$perl -e 'printf("%06d", 19)'
000019
Run Code Online (Sandbox Code Playgroud)

我必须启动 jshell 才能运行任何命令:

$jshell
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro
jshell> String.format("%06d", 19)
$1 ==> "000019"
Run Code Online (Sandbox Code Playgroud)

我在这里发现了类似的问题,但为单个命令创建单独的文件并不是可行的解决方案jsh

同一篇文章的另一个解决方案是:echo "1+2"|jshell

temp=`echo 'String.format("%06d", 19)'|jshell`
echo $temp
Run Code Online (Sandbox Code Playgroud)

哎哟输出

| Welcome to JShell -- Version 9 | For an introduction type: /help intro jshell> String.format("%06d", 19) $1 ==> "000019" jshell>
Run Code Online (Sandbox Code Playgroud)

$temp只期待打印000019

java java-9 jshell

7
推荐指数
1
解决办法
2919
查看次数

当我在 Windows cmd 中按下 BackSpace 按钮时,Jshell 崩溃

当我打开窗口cmd并输入时jshell,它可以工作,但是当我在写东西时。每当我按下BackSpace键。例如,如果我想删除一个错误的字母。jshell 因波纹管错误而崩溃,我正在使用windows 10,并且C:\Program Files\Java\jdk-11.0.1是我在 Windows 中的唯一路径System Environment variables,我也cmd用作终端。这是错误:

Exception in thread "main" java.lang.NullPointerException: charsetName
        at java.base/java.lang.String.<init>(String.java:464)
        at java.base/java.lang.String.<init>(String.java:537)
        at jdk.internal.le/jdk.internal.jline.extra.AnsiInterpretingOutputStream.write(AnsiInterpretingOutputStream.java:92)
        at java.base/java.io.OutputStream.write(OutputStream.java:157)
        at java.base/sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:233)
        at java.base/sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:312)
        at java.base/sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:316)
        at java.base/sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:153)
        at java.base/java.io.OutputStreamWriter.flush(OutputStreamWriter.java:254)
        at jdk.internal.le/jdk.internal.jline.console.ConsoleReader.flush(ConsoleReader.java:1052)
        at jdk.internal.le/jdk.internal.jline.console.ConsoleReader.readLine(ConsoleReader.java:3259)
        at jdk.internal.le/jdk.internal.jline.console.ConsoleReader.readLine(ConsoleReader.java:2383)
        at jdk.internal.le/jdk.internal.jline.console.ConsoleReader.readLine(ConsoleReader.java:2371)
        at jdk.jshell/jdk.internal.jshell.tool.ConsoleIOContext.readLine(ConsoleIOContext.java:142)
        at jdk.jshell/jdk.internal.jshell.tool.JShellTool.getInput(JShellTool.java:1261)
        at jdk.jshell/jdk.internal.jshell.tool.JShellTool.run(JShellTool.java:1174)
        at jdk.jshell/jdk.internal.jshell.tool.JShellTool.start(JShellTool.java:975)
        at jdk.jshell/jdk.internal.jshell.tool.JShellToolBuilder.start(JShellToolBuilder.java:254)
        at jdk.jshell/jdk.internal.jshell.tool.JShellToolProvider.main(JShellToolProvider.java:120)
Run Code Online (Sandbox Code Playgroud)

java windows backspace jshell

7
推荐指数
1
解决办法
387
查看次数

intellij 中的 Jshell 不允许泛型类型

我刚开始在 intellij idea 社区版本中使用 jshell。当我在 jshell 中编写以下代码时,它可以工作。

List<String> list = List.of("a", "b", "c");
System.out.println(list);
Run Code Online (Sandbox Code Playgroud)

但是,相同的代码在 intellij 中不起作用。它说“预期的表达”。它执行得很好,但显示List<String>. 问题是“自动完成”不起作用。为了解决这个问题,我们可以使用原始类型,但我想要一个通用类型。有什么我想念的吗?如何编写泛型类型?

java intellij-idea jshell java-14

7
推荐指数
1
解决办法
462
查看次数

错误:java.lang.InternalError:远程启动失败:com.sun.jdi.CommandLineLaunch

我必须使用jshell java 9功能做一个项目.但是当我使用java 9在intellij中启动时,我有这个错误:

java.lang.InternalError: Failed remote launch: com.sun.jdi.CommandLineLaunch
Run Code Online (Sandbox Code Playgroud)

可能是什么导致了这个?

java intellij-idea java-9 jshell

6
推荐指数
1
解决办法
280
查看次数

如何在JShell中运行作为片段添加的整个Java文件?

我尝试安装JDK 9 Early access version 172来玩JShell.当我尝试打开一个简单的java文件并在将其添加为片段后执行它时,它只显示了修改后的类Test并增加了片段编号.你能帮我理解我哪里出错了吗?

|  Welcome to JShell -- Version 9-ea
|  For an introduction type: /help intro

jshell> /open G:\kavitha\Test.java

jshell> /list

   1 : public class Test{
        public static void main(String[] args){
                 int i = 1;
                 int j = 2;
             System.out.println("Sum of 1 and 2 is : " + (i+j));
        }
       }

jshell> /1
public class Test{
        public static void main(String[] args){
                 int i = 1;
                 int j = 2;
             System.out.println("Sum of 1 and 2 is : …
Run Code Online (Sandbox Code Playgroud)

java java-9 jshell

6
推荐指数
1
解决办法
1619
查看次数

使用错误代码退出jshell

如何使用非零错误代码/exit进行jshell会话?

  • /exityield:进程以退出代码0结束
  • /exit 1yield:进程以退出代码0结束
  • throw new Error("1")yield:java.lang.Error thrown:1 at(#24:1)`和Process以退出代码0结束
  • System.exit(1)产量:状态引擎终止.使用以下命令恢复定义:/ reload -restore ...并且jshell会话不会终止.

类似的bash命令set -e不可用.

java-9 jshell

6
推荐指数
1
解决办法
854
查看次数

JShell &lt;Shift + tab i&gt;在jdk 9中无法正常工作

在Fedora中尝试JShell时,我尝试使用此处指定的代码段转换快捷方式 ,但我认为它不起作用它正在显示

Shift-Tab之后出现意外字符。使用“ i”进行自动导入,或使用“ v”进行变量创建。有关更多信息,请参见:

/帮助快捷方式

我尝试了这些消息中指定的方法,但结果仍然相同

任何想法或我做错了什么?

$ javac-版本

Java 9

Java版本

openjdk版本“ 9”

OpenJDK运行时环境(内部版本9 + 181)

OpenJDK 64位服务器VM(内部版本9 + 181,混合模式)

这是我想做的事情:

jshell $新的JFrame

我键入new JFrame然后按Shift + Tab键(按住Shift键并释放Tab键,然后按i键)。根据文档,它应该显示类似以下内容:

0: Do nothing
1: import: javax.swing.JFrame
Choice:
Run Code Online (Sandbox Code Playgroud)

但它显示

Shift-Tab之后出现意外字符。使用“ i”进行自动导入,或使用“ v”进行变量创建。有关更多信息,请参见:

代替

java java-9 jshell

6
推荐指数
1
解决办法
545
查看次数

最终变量在jshell中运行不正常

我正在使用JDK9的jshell.

我刚刚创建了一个final变量并为其赋值.在下一行我刚修改了这个值.令我惊讶的是,修改最终变量时没有错误.

这是代码片段:

jshell> final int r = 0;
|  Warning:
|  Modifier 'final'  not permitted in top-level declarations, ignored
|  final int r = 0;
|  ^---^
r ==> 0

jshell> r = 1;
r ==> 1

jshell> System.out.println("r = "+r)
r = 1
Run Code Online (Sandbox Code Playgroud)

这是jshell的预期吗?或者还有其他一些方法可以在jshell中使用最终变量?

final access-modifiers java-9 jshell

6
推荐指数
1
解决办法
253
查看次数

JShell访问在jshell实例外部定义的变量

从jShell脚本内部,是否可以访问或注册也在创建JShell的代码中定义的变量?

当前,似乎没有机制可以访问或向Shell实例注册变量,或者从JShell内部不返回任何字符串类型(例如对象或lambda等)。

例如:

    导入jdk.jshell.JShell;
    导入jdk.jshell.JShellException;
    导入jdk.jshell.SnippetEvent;

    导入java.util.List;


    公共班级主要{

        公共静态void main(String [] args)抛出JShellException {
            var localVar = 1;
            JShell shell = JShell.create();
            //如何在shell实例中注册localVar变量或从作用域访问变量
            列表事件= shell.eval(“ var x = localVar;”);
            SnippetEvent event = events.get(0);
            System.out.println(“种类:” + event.snippet()。kind()+“,值:” + event.value());
        }

    }

java-9 java-10 jshell java-11

6
推荐指数
1
解决办法
112
查看次数

如何从 JShell 获得更好的性能?

背景

由于 Nashorn 在 JDK15 中被删除,我正在为我正在开发的应用程序寻找替代方案。我目前仅用于在 java swing 桌面应用程序中动态执行一些用户可定义的格式片段。

我并不是特别想向我的应用程序添加另一个库依赖项(例如 rhino)。如果可用的话,我愿意使用 nashorn 作为附加依赖项(这将使我不必重写代码,并确保与现有 js 片段的兼容性)。除了与《我的世界》相关的东西之外,我还没有看到它在任何地方都可用。

我不会切换到 Graal 虚拟机。

问题

我正在考虑使用 JShell(虽然不是 javascript,但大部分格式化代码非常相似),但我调用它的方式性能很糟糕:

try(JShell js = JShell.create())
{
    js.eval("public int add(int a, int b) { return a + b; }");
    for(int i = 0; i < 100; i++)
    {
        List<SnippetEvent> eval = js.eval("add(5,6)");
        eval.forEach(se -> {
            System.out.println(se.value());
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码中的 for 循环运行时间约为 6 秒(相比之下,nashorn 中的运行时间约为 11 微秒)。这对于我的应用程序来说不够快。

  • 有没有办法从 JSell 中获取类字节码,以便我可以使用反射直接执行该方法,而不是再次调用“eval”?

  • 有没有办法获取我在 JShell 中创建的方法的“方法句柄”?

  • 有没有什么方法可以创建一个函数,其行为是在 JShell 中定义的,但可以从“正常”java 中高性能地调用?

javascript java scripting jshell

6
推荐指数
1
解决办法
238
查看次数