首页 > 解决方案 > 设置特定 JShell 的输出流

问题描述

我有一个代码:

public class App {
    public static void main(String[] args) {
        System.out.println("Hello World from main!");
        JShell shell = JShell.builder().build();
        shell.eval("System.out.println(\"Hello World from JShell!\");");

    }
}

现在我希望我可以只为 JShell 而不是普通代码设置输出流。

我试过了 :

shell.eval("System.setOut(new Printer());");
shell.eval("System.out.println(\"Hello World!\");");

但不起作用!

我的打印机类:

class Printer extends PrintStream{
    public Printer() {
        super(System.out);
    }

    @Override
    public void print(String s) {
        super.print("Message: - " + s);
    }
}

标签: javaevaljshellprintstream

解决方案


首先,您需要让 JShell 使用“本地” executionEngine,以便您可以访问您的Printer

JShell shell = JShell.builder().executionEngine("local").build();

这基本上意味着“相同的JVM”。

其次,请记住导入Printer类,或使用其完全限定名称,因为Printer可能与运行 JShell 代码的包不在同一个包中(REPL从我的实验中调用的包)。

看起来你的Printer课程不是公开的,所以你也应该这样做public


推荐阅读