JDK6新特点:脚本语言支持(Scripting)[Java编程]
本文“JDK6新特点:脚本语言支持(Scripting)[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
概述
JDK6增添了对脚本语言的支持(JSR 223),原理上是将脚本语言编译成bytecode,这样脚本语言也能享用Java平台的诸多上风,包含可移植性,安全等,别的,由于目前是编译成bytecode后再履行,所以比本来边注释边履行效率要高很多.加入对脚本语言的支持后,对Java语言也供应了以下好处.
1、很多脚本语言都有动态特点,比方,你不需求用一个变量之前先声明它,你可以用一个变量存放完好差别范例的对象,你不需求做强迫范例转换,因为转换都是自动的.目前Java语言也可以通过对脚本语言的支持间接得到这种机动性.
2、 可以用脚本语言快速开辟产品原型,因为目前可以Edit-Run,而无需Edit-Compile-Run,当然,因为Java有非常好的IDE支持,我 们完好可以在IDE里面编辑源文件,然后点击运行(隐含编译),以此到达快速开辟原型的目的,所以这点好处基本上可以忽视.
3、通过引入脚本语言可以轻松实现Java利用程序的扩大和自定义,我们可以把本来分布在在Java利用程序中的配置逻辑,数学表达式和业务法则提取出来,转用JavaScript来处理.
Sun的JDK6实现包含了一个基于Mozilla Rhino的 脚本语言引擎,支持JavaScript,这并非阐明JDK6只支持JavaScript,任何第三方都可以自己实现一个JSR-223兼容的脚本引擎 使得JDK6支持别的脚本语言,比方,你想让JDK6支持Ruby,那你可以自己按照JSR 223的标准实现一个Ruby的脚本引擎类,具体一点,你需求实现javax.script.ScriptEngine(简单起见,可以担当javax.script.AbstractScriptEngine)和javax.script.ScriptEngineFactory两个接口.当然,在你实现自己的脚本语言引擎之前,先到scripting.dev.java.net project 这里看看是不是有人已经帮你做了工作,这样你便可以直接拿来用就行.
Scripting API
Scripting API是用于在Java里面编写脚本语言程序的API, 在Javax.script中可以找到Scripting API,我们就是用这个API来编写JavaScript程序,这个包里面有一个ScriptEngineManager类,它是利用Scripting API的进口,ScriptEngineManager可以通过jar服务发现(service discovery)机制探求符合的脚本引擎类(ScriptEngine),利用Scripting API的最简单方法只需下面三步
1、成立一个ScriptEngineManager对象
2、通过ScriptEngineManager得到ScriptEngine对象
3、用ScriptEngine的eval办法履行脚本
下面是一个Hello World程序
/** * @author chinajash */
public class HelloScript {
public static void main(Strin [] args) throws Exception {
ScriptEngineManager factory = new ScriptEngineManage();//step 1
ScriptEngine engine = factory.getEngineByName("JavaScript");//Step 2
engine.eval("print('Hello, Scripting')");//Step 3
}
}
运行上面程序,掌握台会输出Hello, Scripting上面这个简单的Scripting程序演示了如安在Java里面运行脚本语言,除此之外,我们还可以操纵Scripting API实现以下功效1、表露Java对象为脚本语言的全局变量2、在Java中调用脚本语言的办法3、脚本语言可以实现Java的接口4、脚本语言可以像Java一样利用JDK平台下的类下面的类演示了以上4种功效
package Scripting;
import java.io.File;import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
/** * @author chinajash */
public class ScriptingAPITester {
public static void main(String[] args) throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
testScriptVariables(engine);//演示若何表露Java对象为脚本语言的全局变量
testInvokeScriptMethod(engine);//演示如安在Java中调用脚本语言的办法
testScriptInterface(engine);//演示脚本语言若何实现Java的接口
testUsingJDKClasses(engine);//演示脚本语言若何利用JDK平台下的类
}
public static void testScriptVariables(ScriptEngine engine) throws ScriptException{
File file = new File("test.txt");
engine.put("f", file);
engine.eval("println('Total Space:'+f.getTotalSpace())");
}
public static void testInvokeScriptMethod(ScriptEngine engine) throws Exception{
String script = "function hello(name) { return 'Hello,' + name;}";
engine.eval(script);
Invocable inv = (Invocable) engine;
String res = (String)inv.invokeFunction("hello", "Scripting" );
System.out.println("res:"+res);
}
public static void testScriptInterface(ScriptEngine engine) throws ScriptException{
String script = "var obj = new Object();
obj.run = function() { println('run method called');
}";
engine.eval(script);
Object obj = engine.get("obj");
Invocable inv = (Invocable) engine;
Runnable r = inv.getInterface(obj,Runnable.class);
Thread th = new Thread(r);
th.start();
}
public static void testUsingJDKClasses(ScriptEngine engine) throws Exception{
//Packages是脚本语言里的一个全局变量,专用于拜候JDK的package
String js = "function doSwing(t){var f=new Packages.javax.swing.JFrame(t);
f.setSize(400,300);f.setVisible(true);}";
engine.eval(js);
Invocable inv = (Invocable) engine;
inv.invokeFunction("doSwing", "Scripting Swing" );
}
}
Scripting Tool
SUN供应的JDK6中有一个号令行工具??jrunscript,你可以在<JDK6_Home>/bin下面找到这个工具,jrunscript是一个脚本语言的注释程序,它独立于脚本语言,但默许是用JavaScript,我们可以用jrunscript来测试自己写的脚本语言能否精确,下面是一个在号令行运行jrunscript的简单例子
jrunscript
js>println("Hello,JrunScript");
Hello,JrunScript
js>9*8
72.0
js>
以上是“JDK6新特点:脚本语言支持(Scripting)[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |