TypeError: importPackage - это не функция, это объект - PullRequest
0 голосов
/ 23 апреля 2019

Я получаю следующую ошибку при оценке JavaScript с использованием Rhino:

TypeError: importPackage is not a function, it is object

Эта функция является функцией 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 голосов
/ 23 апреля 2019

Я отправляю ответ сам, потому что я думаю, что нашел подходящий обходной путь или, возможно, правильный способ сделать это.Кроме того, сообщение об ошибке, которое я видел, нигде не было найдено с помощью популярных поисковых систем, так что это могло бы спасти чью-то шею.

Я нашел старое сообщение в Группах Google , которое в итоге привело кя к решению.Это показалось мне немного загадочным, потому что у меня нет опыта работы с движком:

Чтобы использовать importPackage, ваша корневая область должна быть создана с новым ImporterTopLevel (cx).

После некоторого поиска кода, который использовал движок (который я не писал), я заменил эту строку

Scriptable scope = context.initStandardObjects();

на эту

Scriptable scope = new ImporterTopLevel(context);

Я до сих пор не до конца понимаю, почему он не будет работать, несмотря на код в ScriptRuntime, но он работает сейчас.Само сообщение об ошибке не совсем верно, importPackage просто не известен, сообщение является артефактом некорректной обработки ошибок, похожим на if (isFunction()) {"error about function"} else {"error about object"}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...