【问题标题】:Execute code from string with defined variables in Java使用Java中定义的变量从字符串执行代码
【发布时间】:2021-11-13 14:26:37
【问题描述】:

我有以下课程

class ListNode
{
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}

我的任务是编写一个方法:

  1. int[]为参数。
  2. 反转数组。
  3. 返回ListNode,它具有数组中当前元素的值,具有新创建的ListNode 的.next 与数组中的相应值,依此类推。

给定new int[]{0, 8, 7};的输入,我希望得到一个ListNode,其中值为7,.next是一个值为8的新节点,最后.next.next是一个值为0的新节点。

我写了以下方法来完成这样的行为

public static ListNode reverseAndLinkToListNode(int [] arrayToReverse)
{
    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("js");

    int finalDigitsArrayLength = arrayToReverse.length;

    ListNode finalNode = new ListNode();

    if (finalDigitsArrayLength > 0)
    {
        finalNode.val = arrayToReverse[finalDigitsArrayLength - 1];
        int j = 1;

        for (int i = finalDigitsArrayLength - 2; i >= 0; i--)
        {
            try
            {
                // create a new list node
                ListNode newlyCreatedNode = new ListNode(arrayToReverse[i]);
                // calculate how many 'nexts' I need
                String codeToExecute = returnNumberOfNexts(j);
                // set the next field with the list node I just created
                engine.eval(codeToExecute);
            }
            catch (Exception e)
            {
                System.out.println(e);
            }

            j++;
        }
    }

    return finalNode;
}


public static String returnNumberOfNexts(int nextCounter)
{
    String finalDotNextString = "finalNode";

    if (nextCounter > 0)
    {
        for (int i = 0; i < nextCounter; i++)
        {
            finalDotNextString += ".next";
        }
    }

    finalDotNextString += " = newlyCreatedNode;";

    return finalDotNextString;
}

上面的解决方案返回了正确的代码来执行,但是在执行时,我得到:

javax.script.ScriptException: ReferenceError: "finalNode" is not defined in <eval> at line number 1

如何在引擎中定义finalNodenewlyCreatedNode 变量?

【问题讨论】:

  • 你为什么需要ScriptEngine?只需自己循环调用.next()即可。
  • 这将简单地覆盖finalNode的.next成员。我需要把它们都链接起来
  • 我的意思是使用循环遍历节点并设置最后一个元素的.next。您可以将.next 的结果分配给一个变量,并在循环中对该变量调用.next(每次都将变量设置为结果)

标签: java reference scriptengine


【解决方案1】:

您的脚本引擎在尝试解析“finalNode”变量时失败。原因是 finalNode 在 Java 中是已知的,但在 Javascript 引擎中却不是。所以你需要告诉脚本引擎如何解析变量。我没有测试代码,但它可能看起来有点像这样:

ListNode finalNode = new ListNode();
ScriptEngine engine = manager.getEngineByName("js");
Bindings bindings = engine.getBindings(ScriptContext.GLOBAL_SCOPE);
if (bindings==null) {
    bindings = engine.createBindings();
    engine.setBindings(ScriptContext.GLOBAL_SCOPE);
}
bindings.put("finalNode", finalNode);
engine.eval(codeToExecute);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2015-11-08
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多