java开发150个建议(11)


回到顶部
建议16:易变业务使用脚本语言编写
Java世界一直在遭受着异种语言的入侵,比如PHP,Ruby,、等,这些入侵者都有一个共同特征:全是同一类语言-----脚本语言,它们都是在运行期解释执行的 。为什么Java这种强编译型语言会需要这些脚本语言呢?那是因为脚本语言的三大特征,如下所示:
灵活:脚本语言一般都是动态类型,可以不用声明变量类型而直接使用,可以再运行期改变类型 。便捷:脚本语言是一种解释性语言,不需要编译成二进制代码,也不需要像Java一样生成字节码 。它的执行时依靠解释器解释的,因此在运行期间变更代码很容易,而且不用停止应用;简单:只能说部分脚本语言简单,比如,对于程序员来说,没有多大的门槛 。
脚本语言的这些特性是Java缺少的,引入脚本语言可以使Java更强大,于是Java6开始正式支持脚本语言 。但是因为脚本语言比较多,Java的开发者也很难确定该支持哪种语言,于是JSCP(Java)很聪明的提出了规范,只要符合该规范的语言都可以在Java平台上运行(它对是默认支持的) 。
简单看看下面这个小例子:
function formual(var1, var2){return var1 + var2 * factor;}
这就是一个简单的脚本语言函数,可能你会很疑惑:(因子)这个变量是从那儿来的?它是从上下文来的,类似于一个运行的环境变量 。该js保存在C:/model.js中,下一步需要调用公式,代码如下:
1 import java.io.FileNotFoundException;2 import java.io.FileReader;3 import java.util.Scanner;4 5 import javax.script.Bindings;6 import javax.script.Invocable;7 import javax.script.ScriptContext;8 import javax.script.ScriptEngine;9 import javax.script.ScriptEngineManager;10 import javax.script.ScriptException;11 12 public class Client16 {13public static void main(String[] args) throws FileNotFoundException,14ScriptException, NoSuchMethodException {15// 获得一个JavaScript执行引擎16ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");17// 建立上下文变量18Bindings bind = engine.createBindings();19bind.put("factor", 1);20// 绑定上下文,作用于是当前引擎范围21engine.setBindings(bind, ScriptContext.ENGINE_SCOPE);22Scanner input =new Scanner(System.in);2324while(input.hasNextInt()){25int first = input.nextInt();26int second = input.nextInt();27System.out.println("输入参数是:"+first+","+second);28// 执行Js代码29engine.eval(new FileReader("C:/model.js"));30// 是否可调用方法31if (engine instanceof Invocable) {32Invocable in = (Invocable) engine;33// 执行Js中的函数34Double result = (Double) in.invokeFunction("formula", first, second);35System.out.println("运算结果是:" + result.intValue());36}37}38 39}40 }
上段代码使用类接受键盘输入的两个数字,然后调用脚本的函数计算其结果,注意,除非输入了一个非int数字,否则当前JVM会一直运行,这也是模拟生成系统的在线变更情况 。运行结果如下:
输入参数是;1,2 运算结果是:3
此时,保持JVM的运行状态,我们修改一下函数,代码如下:
function formual(var1, var2){return var1 + var2 - factor;}
其中,乘号变成了减号,计算公式发生了重大改变 。回到JVM中继续输入,运行结果如下:
输入参数:1,2 运行结果是:2
修改Js代码,JVM没有重启,输入参数也没有任何改变,仅仅改变脚本函数即可产生不同的效果 。这就是脚本语言对系统设计最有利的地方:可以随时发布而不用部署;这也是我们最喜爱它的地方----即使进行变更,也能提供不间断的业务服务 。
Java6不仅仅提供了代码级的脚本内置,还提供了命令工具,它可以再批处理中发挥最大效能,而且不需要通过JVM解释脚本语言,可以直接通过该工具运行脚本 。想想看 。这是多么大的诱惑力呀!而且这个工具是可以跨操作系统的,脚本移植就更容易了 。