2015-10-12 3 views
2

Я оценил следующий сценарий с помощью NashornScriptEngine:Nashorn: Вызов функции внутри пространства имен

var Namespace = { 
    test: function() 
    { 
     return "It works"; 
    } 
} 

Теперь я хочу, чтобы вызвать функцию test.

При использовании метода invokeFunction из Насхорн двигателя следующее исключение:

java.lang.NoSuchMethodException: No such function Namespace.test 

Как можно назвать эту функцию?

+0

ли я сделать это правильно? –

ответ

4

Вы пытаетесь получить доступ к глобальной функции, которая называется window["Namespace.test"], а не window.Namespace.Test. Сначала вам нужно получить ссылку на Namespace, затем вы можете позвонить invocable.invokeMethod, указав в качестве своего контекста Namespace (this).

Например, чтобы позвонить JSON.parse(), вы можете использовать следующее:

Object json = engine.eval("JSON"); // Or "Namespace" in your case 
Object data = invocable.invokeMethod(json, "parse", contactJson); //"test" for the case you mention 
+0

Спасибо, что сделал трюк. Кстати, из ваших переменных имен я предполагаю, что вы вызвали метод 'invokeMethod' на объект' Invocable'. Всегда ли безопасно использовать 'engineManager.getEngineByName (« nashorn »)' to 'NashornScriptEngine'? – Ercksen

+1

@ Ercksen Я не уверен на 100%, но следующий код безопасен 'ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName ("nashorn"); Invocable inv = (Invocable) engine; inv.invokeFunction («hello», «Scripting!»); 'Если у вас есть дополнительные вопросы, задайте отдельный вопрос, чтобы он мог быть полезен другим пользователям SO –

Смежные вопросы