TypeError:importPackage不是函数,它是对象

问题描述 投票:-1回答:1

使用JavaScript评估Rhino时出现以下错误:

TypeError: importPackage is not a function, it is object

此函数是一个feature of Rhino,用于导入Java类以实现与Java的互操作性。

我查看了相关的Rhino代码,发现importPackage功能包含在名为ImporterTopLevel的类中,该类似乎在ScriptRuntime中加载:

public static ScriptableObject initStandardObjects(Context cx,
                                                   ScriptableObject scope,
                                                   boolean sealed)
{
    ScriptableObject s = initSafeStandardObjects(cx, scope, sealed);

    new LazilyLoadedCtor(s, "Packages",
            "org.mozilla.javascript.NativeJavaTopPackage", sealed, true);
    new LazilyLoadedCtor(s, "getClass",
            "org.mozilla.javascript.NativeJavaTopPackage", sealed, true);
    new LazilyLoadedCtor(s, "JavaAdapter",
            "org.mozilla.javascript.JavaAdapter", sealed, true);
    new LazilyLoadedCtor(s, "JavaImporter",
            "org.mozilla.javascript.ImporterTopLevel", sealed, true);

    for (String packageName : getTopPackageNames()) {
        new LazilyLoadedCtor(s, packageName,
                "org.mozilla.javascript.NativeJavaTopPackage", sealed, true);
    }

    return s;
}

因此,我希望它可以工作,但出于某种原因,它没有。

javascript java rhino
1个回答
-1
投票

我自己发布了一个答案,因为我认为我找到了合适的解决方法,或者可能是正确的方法。此外,我看到的错误消息无法使用流行的搜索引擎找到,所以这可以节省一些人的脖子。

我找到了一个老message on Google Groups,最终导致我解决方案。这对我来说听起来有点神秘,因为我对引擎没有任何经验:

要使用importPackage,必须使用新的ImporterTopLevel(cx)创建根范围。

在对使用引擎的代码(我没写过)进行了一些挖掘之后,我更换了这一行

Scriptable scope = context.initStandardObjects();

用这个

Scriptable scope = new ImporterTopLevel(context);

我仍然不完全理解为什么它不会工作尽管ScriptRuntime中的代码,但它现在有效。错误消息本身并不是真的,importPackage根本就不知道,消息是类似于if (isFunction()) {"error about function"} else {"error about object"}的错误处理错误的工件。

© www.soinside.com 2019 - 2024. All rights reserved.