如何获取当前运行的JShell实例引用并加载外部变量文件?
在JShell应用中加载变量文件并获取当前JShell实例的实现思路
嘿,刚好对JShell的API比较熟悉,给你梳理两个直接能用的方案,完美匹配你的需求:
第一步:轻松获取当前JShell实例
JShell本身提供了非常直观的静态方法JShell.current(),不管你是在JShell交互式环境里写代码,还是在嵌入JShell的应用中,直接调用这个方法就能拿到当前正在运行的JShell对象引用,这一步毫无难度。
方案一:复用你熟悉的加载命令(最省事)
你之前在启动脚本里用的/o FileWithVars.XYZ是JShell的内置命令,在代码里可以通过JShell实例的eval()方法直接执行这条命令,完美复刻启动脚本的效果。给你写个示例代码:
import jdk.jshell.JShell; import jdk.jshell.SnippetEvent; public class JShellVarLoader { public static void main(String[] args) { // 拿到当前JShell实例 JShell jshell = JShell.current(); // 执行加载文件的命令,/o保证变量持久化可访问 Iterable<SnippetEvent> loadEvents = jshell.eval("/o FileWithVars.XYZ"); // 可选:检查加载结果,排查可能的错误 for (SnippetEvent event : loadEvents) { if (event.status() == SnippetEvent.Status.REJECTED) { System.err.println("加载失败:" + event.exception().getMessage()); } else if (event.status() == SnippetEvent.Status.VALID) { System.out.println("成功加载:" + event.snippet().source()); } } } }
这里的/o参数和你之前用的一样,作用是让文件里的变量成为“持久化片段”,后续代码可以直接访问这些变量,和启动脚本加载的效果完全一致。
方案二:直接读取文件内容执行(更灵活)
如果不想依赖JShell的内置命令,也可以直接读取文件的内容,把代码字符串传给eval()方法执行,这种方式更灵活,比如你可以在读取后对代码做一些动态修改再执行。示例如下:
import jdk.jshell.JShell; import java.nio.file.Files; import java.nio.file.Paths; public class JShellFileContentLoader { public static void main(String[] args) throws Exception { JShell jshell = JShell.current(); // 读取目标文件的全部内容 String varCode = Files.readString(Paths.get("FileWithVars.XYZ")); // 执行文件中的变量定义代码 jshell.eval(varCode); // 测试:验证变量是否可用,比如获取x的值 Object xValue = jshell.eval("x"); System.out.println("当前x的值:" + xValue); Object sValue = jshell.eval("s"); System.out.println("当前s的值:" + sValue); } }
这种方式不需要依赖JShell的命令语法,直接执行原生Java代码片段,适配场景更多。
几个注意点
- 确保
FileWithVars.XYZ的路径正确,如果用相对路径,要和JShell运行的工作目录对应; - 如果文件里有语法错误,
eval()会返回包含错误信息的SnippetEvent,可以通过遍历事件来排查问题; - 如果是在普通Java程序中嵌入JShell,
JShell.current()会返回当前线程关联的实例,要是还没创建实例,也可以用JShell.create()手动创建后再操作。
内容的提问来源于stack exchange,提问作者StonedLover
相关产品推荐
相关产品推荐

