Java使用ScriptEngine执行字符串代码时如何传入自定义变量
报错原因
ScriptEngine的执行上下文和当前Java代码的上下文相互独立,Java代码中定义的finalNode、newlyCreatedNode变量默认不会被脚本引擎识别,需要手动将Java对象注入到ScriptEngine的上下文中。
修复方案
在调用engine.eval(codeToExecute)之前,添加两行代码将变量注入脚本引擎即可:
// create a new list node ListNode newlyCreatedNode = new ListNode(arrayToReverse[i]); // calculate how many 'nexts' I need String codeToExecute = returnNumberOfNexts(j); // 注入Java变量到脚本引擎上下文 engine.put("finalNode", finalNode); engine.put("newlyCreatedNode", newlyCreatedNode); // set the next field with the list node I just created engine.eval(codeToExecute);
更优的实现方案
你的需求完全不需要引入ScriptEngine,动态拼接脚本执行的方式不仅性能差,还存在额外的异常风险,常规的链表构建逻辑如下即可实现同等效果:
public static ListNode reverseAndLinkToListNode(int [] arrayToReverse) { if (arrayToReverse == null || arrayToReverse.length == 0) { return null; } // 头节点取数组最后一位,对应反转后的第一个元素 ListNode head = new ListNode(arrayToReverse[arrayToReverse.length - 1]); ListNode current = head; // 从数组倒数第二位向前遍历构建链表 for (int i = arrayToReverse.length - 2; i >= 0; i--) { current.next = new ListNode(arrayToReverse[i]); current = current.next; } return head; }
内容的提问来源于stack exchange,提问作者Joe D
相关产品推荐
相关产品推荐

