有没有办法在 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。
当我打开窗口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) 我刚开始在 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>. 问题是“自动完成”不起作用。为了解决这个问题,我们可以使用原始类型,但我想要一个通用类型。有什么我想念的吗?如何编写泛型类型?
我必须使用jshell java 9功能做一个项目.但是当我使用java 9在intellij中启动时,我有这个错误:
java.lang.InternalError: Failed remote launch: com.sun.jdi.CommandLineLaunch
Run Code Online (Sandbox Code Playgroud)
可能是什么导致了这个?
我尝试安装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) 如何使用非零错误代码/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不可用.
在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”进行变量创建。有关更多信息,请参见:
代替
我正在使用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中使用最终变量?
从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());
}
}
背景:
由于 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 中高性能地调用?