1、许多脚本语言都有动态特性,比如,你不需要用一个变量之前先声明它,你可以用一个变量存放完全不同类型的对象,你不需要做强制类型转换,因为转换都是自动的。现在Java语言也可以通过对脚本语言的支持间接获得这种灵活性。
2、可以用脚本语言快速开发产品原型,因为现在可以Edit-Run,而无需Edit-Compile-Run,当然,因为Java有非常好的IDE支持,我们完全可以在IDE里面编辑源文件,然后点击运行(隐含编译),以此达到快速开发原型的目的,所以这点好处基本上可以忽略。
3、通过引入脚本语言可以轻松实现Java应用程序的扩展和自定义,我们可以把原来分布在在Java应用程序中的配置逻辑,数学表达式和业务规则提取出来,转用JavaScript来处理。
Sun的JDK6实现包含了一个基于MozillaRhino的脚本语言引擎,支持JavaScript,这并不是说明JDK6只支持JavaScript,任何第三方都可以自己实现一个JSR-223兼容的脚本引擎使得JDK6支持别的脚本语言,比如,你想让JDK6支持Ruby,那你可以自己按照JSR223的规范实现一个Ruby的脚本引擎类,具体一点,你需要实现javax.script.ScriptEngine(简单起见,可以继承javax.script.AbstractScriptEngine)和javax.script.ScriptEngineFactory两个接口。当然,在你实现自己的脚本语言引擎之前,先到scripting.dev.java.netproject这里看看是不是有人已经帮你做了工作,这样你就可以直接拿来用就行。
ScriptingAPI
-------------------------------
ScriptingAPI是用于在Java里面编写脚本语言程序的API,在Javax.script中可以找到ScriptingAPI,我们就是用这个API来编写JavaScript程序,这个包里面有一个ScriptEngineManager类,它是使用ScriptingAPI的入口,ScriptEngineManager可以通过jar服务发现(servicediscovery)机制寻找合适的脚本引擎类(ScriptEngine),使用ScriptingAPI的最简单方式只需下面三步
1、创建一个ScriptEngineManager对象
2、通过ScriptEngineManager获得ScriptEngine对象
3、用ScriptEngine的eval方法执行脚本
下面是一个HelloWorld程序
/***@authorchinajash*/
publicclassHelloScript{
publicstaticvoidmain(Strin []args)throwsException{
ScriptEngineManagerfactory=newScriptEngineManage();//step1
ScriptEngineengine=factory.getEngineByName("JavaScript");//Step2
engine.eval("print(/'Hello,Scripting/')");//Step3
}
}
运行上面程序,控制台会输出Hello,Scripting上面这个简单的Scripting程序演示了如何在Java里面运行脚本语言,除此之外,我们还可以利用ScriptingAPI实现以下功能1、暴露Java对象为脚本语言的全局变量2、在Java中调用脚本语言的方法3、脚本语言可以实现Java的接口4、脚本语言可以像Java一样使用JDK平台下的类下面的类演示了以上4种功能
packageScripting;
importjava.io.File;importjavax.script.Invocable;
importjavax.script.ScriptEngine;
importjavax.script.ScriptEngineManager;
importjavax.script.ScriptException;
/***@authorchinajash*/
publicclassScriptingAPITester{
publicstaticvoidmain(String[]args)throwsException{
ScriptEngineManagermanager=newScriptEngineManager();
ScriptEngineengine=manager.getEngineByName("JavaScript");
testScriptVariables(engine);//演示如何暴露Java对象为脚本语言的全局变量
testInvokeScriptMethod(engine);//演示如何在Java中调用脚本语言的方法
testScriptInterface(engine);//演示脚本语言如何实现Java的接口
testUsingJDKClasses(engine);//演示脚本语言如何使用JDK平台下的类
}
publicstaticvoidtestScriptVariables(ScriptEngineengine)throwsScriptException{
Filefile=newFile("test.txt");
engine.put("f",file);
engine.eval("println(/'TotalSpace:/'+f.getTotalSpace())");
}
publicstaticvoidtestInvokeScriptMethod(ScriptEngineengine)throwsException{
Stringscript="functionhello(name){return/'Hello,/'+name;}";
engine.eval(script);
Invocableinv=(Invocable)engine;
Stringres=(String)inv.invokeFunction("hello","Scripting");
System.out.println("res:"+res);
}
publicstaticvoidtestScriptInterface(ScriptEngineengine)throwsScriptException{
Stringscript="varobj=newObject();
obj.run=function(){println(/'runmethodcalled/');
}";
engine.eval(script);
Objectobj=engine.get("obj");
Invocableinv=(Invocable)engine;
Runnabler=inv.getInterface(obj,Runnable.class);
Threadth=newThread(r);
th.start();
}
publicstaticvoidtestUsingJDKClasses(ScriptEngineengine)throwsException{
//Packages是脚本语言里的一个全局变量,专用于访问JDK的package
Stringjs="functiondoSwing(t){varf=newPackages.javax.swing.JFrame(t);
f.setSize(400,300);f.setVisible(true);}";
engine.eval(js);
Invocableinv=(Invocable)engine;
inv.invokeFunction("doSwing","ScriptingSwing");
}
}
ScriptingTool
-----------------------------
SUN提供的JDK6中有一个命令行工具??jrunscript,你可以在<JDK6_Home>/bin下面找到这个工具,jrunscript是一个脚本语言的解释程序,它独立于脚本语言,但默认是用JavaScript,我们可以用jrunscript来测试自己写的脚本语言是否正确,下面是一个在命令行运行jrunscript的简单例子
jrunscript
js>println("Hello,JrunScript");
Hello,JrunScript
js>9*8
72.0
js>