2012-05-21 5 views
1

Итак, вот сделка: Я прочитал this article и начал пытался использовать Rhino. До сих пор я получил, как вызвать функцию, и как получить ее возврат. То, что я не могу сделать, это передать параметр функции. Вот мой код:Передача параметров функции javascript

ScriptEngineManager engineMgr = new ScriptEngineManager(); 
ScriptEngine engine = engineMgr.getEngineByName("ECMAScript"); 

String js = ""; 
js += "function add(a, b) {"; 
js += " var sum = parseFloat(a) + parseFloat(b);"; 
js += " println(sum);"; 
js += "}"; 

engine.put("a", 3); 
engine.put("b", 5); 

Object returnn = null; 
try { 
    engine.eval(js); 

    Invocable invocableEngine = (Invocable) engine; 
    returnn = invocableEngine.invokeFunction("add"); 
} catch (ScriptException e) { 
    System.out.println("Script error."); 
} catch (NoSuchMethodException e) { 
    System.out.println("Method error."); 
} 

System.out.println(returnn); 

Я не получаю никакого исключения, но возврат возвращается как NaN. Я попробовал напечатать a и b (Параметры), и они всегда равны нулю. Если это не лучший способ вызвать функцию, просто укажите мне какой-нибудь полезный поток. (Который я не нашел на мой собственный)

TYVM заранее

+1

Вы можете избавиться от '.put' вызовов. И вместо этого вызывается 'invokeFunction (« add », 3, 5)' – skarmats

+0

Это сработало. Чем ты! Но если я могу спросить что-то еще, я не всегда буду знать, сколько параметров имеет метод. Любые предложения о том, как это решить? –

+0

См. Ответ ниже (от @Dan Howard) – skarmats

ответ

1

Это работает для меня:

Object params[] = {1,2,3}; 
Invocable invocable = (Invocable) script.getEngine(); 
invocable.invokeFunction("myFunction", params); 
+0

'invocable.invocableEngine' должен, вероятно, быть' invocableEngine.invokeFunction' – skarmats

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