使用脚本实现设计和性能的平衡
2010-09-14 13:32:58 来源:WEB开发网Invocable 接口的使用非常有趣。如您所见,如果引擎实现了 Invocable 接口,则 Java 开发人员可以使用它的 InvokeFunction 方法调用之前被处理脚本中的函数。该方法使用函数名称作为第一个参数,另一个参数是 Object 变量(varargs)的变量名称。在本例中,代码将调用 sayHello 函数和将 World 变量传递给该函数。结果,代码将通过标准输出打印出“Hello World”文本。
方法
对于面向对象的脚本语言,可以使用相同的接口调用处理脚本所创建的对象的方法。为演示此特性,我将创建一个适当的脚本(位于 method.js 文件中):
function Hello() {}
Hello.prototype.sayHello = function(value) {
with (this) println("Hello " + value);
}
var hello = new Hello();
hello.sayHello("World1");
该脚本将创建一个含有 sayHello 原型函数的 Hello 类。然后,它将实例化一个 hello 变量并调用它的方法。结果,这个脚本将通过标准输出打印“Hello World1”文本。
接下来,我们看看以下这段 Java 代码。
package net.scriptinginjava.invocable;
import java.io.FileReader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class MethodTest {
public static void main(String[] args) throws Exception {
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("js");
if (engine instanceof Invocable) {
engine
.eval(new FileReader(
"src/net/scriptinginjava/invocable/method.js"));
((Invocable) engine).invokeMethod(engine
.get("hello"), "sayHello", "World2");
}
}
}
同样,此示例与之前处理脚本并执行脚本中定义的函数的 Java 程序极为相似。惟一区别就是这个示例使用 invokeMethod 方法调用对象方法。请回想我们在本例中所使用的脚本:它将实例化一个 hello 对象。这样,我们便可以使用 engine.get("hello") 语句通过引擎的上下文获取该对象。这正是传递给 invokeMethod 方法的第一个参数;该对象定义在我们希望调用的一个处理脚本中。其他参数与 invokeFunction 方法相同:方法名称和对象变量编号将作为参数传递给该方法。在本例中,我们调用了 sayHello 方法将传递 World2 作为惟一的参数。由于 sayHello 方法被调用了两次(脚本调用了一次,Java 应用程序调用了一次),因此应用程序将通过标准输出打印以下内容:
更多精彩
赞助商链接