【问题标题】:TypeError: importPackage is not a function, it is objectTypeError:importPackage 不是函数,它是对象
【发布时间】:2019-09-12 16:42:26
【问题描述】:

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

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】:

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

    我找到了一个旧的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"} 的错误处理的产物。

    【讨论】:

    • 我不知道为什么这被否决了,但这正是我所需要的。嵌入 Rhino 的示例都显示使用 initStandardObjects 而不是 ImporterTopLevel 作为获取范围的方式 - 这意味着您的脚本无法调用 importPackage。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2014-01-31
    • 2014-02-16
    • 2015-08-11
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多