function cal(var1,var2) { return var1+var2-factor; }
然后我们开始写java代码,java代码主要为以下部分:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;
import javax.script.Bindings;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class ScriptText {
public static void main(String[] args) throws FileNotFoundException, ScriptException, Exception {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
Bindings bind = engine.createBindings();
bind.put("factor", 2); //这里绑定一个factor的值为2.
engine.setBindings(bind,ScriptContext.ENGINE_SCOPE);
Scanner input = new Scanner(System.in);
while(input.hasNext())
{
int first = input.nextInt();
int sec = input.nextInt();
System.out.println("输入的参数为:"+ first+ " , " + sec);
engine.eval_r(new FileReader("E:/cal.js"));
if(engine instanceof Invocable)
{
Invocable in = (Invocable)engine;
Double result = (Double)in.invokeFunction("cal",first,sec);
System.out.println("运算结果为:" + result.intValue());
}
}
}
}
其中的“E:/cal.js”就是我们js文件的保存路径。并且这个主函数可以循环的输入。
我们运行一下这个程序得到的结果如下:
1
2
输入的参数为:1 , 2
运算结果为:1
上面也就是 调用了 1 + 2 - 2 = 1 ,所以结果为1
我们将js文件中的function方法改变下,改编为下面的函数:
function cal(var1,var2) { return var1+var2*factor; }
我们保存js文件,然后再继续在运行的程序中输入我们要计算的数字,(注意:这里不需要重新启动程序,因为输入时循环输入的)
我们再来看这个输出的结果:
1
2
输入的参数为:1 , 2
运算结果为:5
我们看到我们得到的结果为5,我们发现程序调用了我们修改后的js文件中函数,也就是调用方式为 1 + 2 * 2 = 5 所以我们得到的结果为5。
这个结果我们是否觉得有点神奇呢,我们一般的java程序在运行后,它在这次的运行中输入相同的值结果应该是不变的,但是这个程序在运行同一个程序的时候输入相同值但是得到的结果变化了,这主要是javascript指解释性语言,当程序需要用到js中的function的时候他才去解释执行这个函数,但是我们的function函数已经变化了,所以它就加载执行改变后的js代码,所以得到的就是我们有点意外的结果。
这样的优势是我们在有的应用中不需要重新启动程序就可以改变它的业务逻辑,这样在实时系统中会有比较重要的应用。