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

时间:2019-04-23 13:19:11

标签: javascript java rhino

使用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;
}

因此,我希望它能正常工作,但是由于某些原因,它却无法工作。

1 个答案:

答案 0 :(得分:-1)

我自己发布了一个答案,因为我认为我找到了合适的解决方法,或者也许是正确的方法。另外,使用流行的搜索引擎无法找到我看到的错误消息,因此可以省去别人的麻烦。

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

  

要使用importPackage,您的根作用域必须使用new创建   ImporterTopLevel(cx)。

在挖掘了使用引擎的代码(我没有写过)后,我替换了这一行

Scriptable scope = context.initStandardObjects();

与此一起

Scriptable scope = new ImporterTopLevel(context);

尽管ScriptRuntime中的代码仍然无法完全理解为什么它不起作用,但是现在它仍然可以工作。错误消息本身并不完全正确,根本不知道importPackage,该消息是错误的错误处理的产物,类似于if (isFunction()) {"error about function"} else {"error about object"}