使用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;
}
因此,我希望它能正常工作,但是由于某些原因,它却无法工作。
答案 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"}
。