Java中使用ScriptEngineManager定义变量解决ListNode构建ReferenceError问题
你遇到的报错是因为Java本地变量默认不会被ScriptEngine的执行上下文识别,需要手动将依赖的变量、类都注入到引擎上下文中才能正常执行,按以下步骤修改即可:
- 提前把
ListNode类注入到引擎上下文,方便JS侧创建实例 - 每次执行eval前,把当前用到的
finalNode、输入char数组、遍历下标都注入到引擎上下文
修改后的完整代码如下:
调整后的addTwoNumbersTo方法
public static ListNode addTwoNumbersTo(char[] finalDigitsToReverse) throws ScriptException { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); // 暴露ListNode类给JS引擎 engine.put("ListNode", ListNode.class); int finalDigitsArrayLength = finalDigitsToReverse.length; ListNode finalNode = new ListNode(); if (finalDigitsArrayLength > 0) { finalNode.val = Integer.parseInt(String.valueOf(finalDigitsToReverse[finalDigitsArrayLength - 1])); // 注入链表头节点到引擎上下文 engine.put("finalNode", finalNode); int j = 1; for (int i = finalDigitsArrayLength - 2; i >= 0; i--) { // 注入当前遍历需要用到的数组和下标 engine.put("finalDigitsToReverse", finalDigitsToReverse); engine.put("i", i); engine.eval(returnNumberOfNexts(j)); j++; } } return finalNode; }
returnNumberOfNexts方法无需修改,保持原有逻辑即可。
注:该方案依赖JDK8自带的Nashorn JS引擎,高版本JDK需要单独引入Nashorn依赖才能正常运行。动态脚本执行性能远低于常规指针遍历方案,仅作为思路验证使用。
内容的提问来源于stack exchange,提问作者Joe D
相关产品推荐
相关产品推荐

