使用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;
}
因此,我希望它可以工作,但出于某种原因,它没有。
我自己发布了一个答案,因为我认为我找到了合适的解决方法,或者可能是正确的方法。此外,我看到的错误消息无法使用流行的搜索引擎找到,所以这可以节省一些人的脖子。
我找到了一个老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"}
的错误处理错误的工件。