Java8 Nashorn引擎调用eval执行加法运算报错如何解决?
Nashorn引擎变量传递加法实现方案
报错本质是Nashorn引擎的执行上下文与Java代码上下文相互隔离,默认无法直接读取Java侧定义的局部变量,可通过以下两种方案实现需求:
方案1:直接拼接变量值到脚本字符串
适合简单数值计算场景,无需额外处理上下文:
ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine engine = sem.getEngineByName("nashorn"); Integer sum = 20; Integer var2 = 30; try { // 将Java变量的值直接拼接为脚本表达式字符串 sum = (Integer) engine.eval(sum + "+" + var2); } catch (Exception e) { System.out.println("Error executing script: " + e.getMessage()); }
方案2:通过Bindings注入变量到引擎上下文
更规范的通用方案,支持字符串、自定义对象等复杂类型变量传递,可避免脚本注入风险:
import javax.script.Bindings; // 其余引用保持和原有代码一致 ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine engine = sem.getEngineByName("nashorn"); Integer sum = 20; Integer var2 = 30; try { // 创建绑定对象,将Java变量注入到脚本执行上下文 Bindings bindings = engine.createBindings(); bindings.put("sum", sum); bindings.put("var2", var2); // 执行脚本时传入绑定对象,引擎即可直接识别对应变量名 sum = (Integer) engine.eval("sum + var2", bindings); } catch (Exception e) { System.out.println("Error executing script: " + e.getMessage()); }
两种方案执行后都可以得到sum=50的正确结果。
内容的提问来源于stack exchange,提问作者Antony Jacob
相关产品推荐
相关产品推荐

