调用脚本内的函数
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
再来看看在 Java 中调用 JavaScript 函数,首先在脚本 script.js 中定义函数 sayHello:
function sayHello(name){
print("hello, "+name+"!");
}
然后在 Java 代码中,将引擎转换为可调用(Invocable)引擎,应该注意的是,Invocable 接口是一个可选的接口,如果要编写自己的脚本引擎,可以不实现此接口。rhino 引擎实现 了该接口,因此我们可以很方便的做一个转换,然后调用 invoceFunction 方法来调用脚本 中的函数:
public static void main(String args[]){
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
try {
engine.eval(new java.io.FileReader("scripts/script.js"));
} catch (ScriptException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Invocable invEngine = (Invocable)engine;
try {
invEngine.invokeFunction("sayHello", "jack");
} catch (ScriptException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
运行结果为:
hello, jack!
由于 JavaScript 是”面向对象”的语言,因此我们可以调用一个对象的方法,我们将全局函 数 sayHello 包装在对象 object 上,作为 object 的一个属性:
var object = new Object();
object.sayHello = function(name){
print("hello, "+name+"!");
}
然后在 Java 代码中通过 invokeMethod 方法来调用,首先从脚本引擎中取道这个对象的 实例,通过 enginge.get(name)
方法来实现:
public static void main(String args[]){
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
try {
engine.eval(new java.io.FileReader("scripts/script.js"));
} catch (ScriptException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Invocable invEngine = (Invocable)engine;
Object obj = engine.get("object");
try {
invEngine.invokeMethod(obj, "sayHello", "jack again");
} catch (ScriptException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
在线练习
{$ activeFileHint $}