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(String[] args) throws Exception{
ScriptEngineManager factory = new ScriptEngineManager();//step1
ScriptEngine engine =factory.getEngineByName("JavaScript");//Step2
engine.eval("print('Hello, Scripting')");//Step3
}
}
运行上面程序,控制台会输出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('TotalSpace:'+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", "ScriptingSwing" );
}
} //class end;
ScriptingTool
--------------------------------------------------------------------------------
SUN提供的JDK6中有一个命令行工具jrunscript,你可以在<JDK6_Home>/bin下面找到这个工具,jrunscript是一个脚本语言的解释程序,它独立于脚本语言,但默认是用JavaScript,我们可以用jrunscript来测试自己写的脚本语言是否正确,下面是一个在命令行运行jrunscript的简单例子
jrunscript
js>println("Hello,JrunScript");
Hello,JrunScript
js>9*8
72.0
js>
Rihno的介绍:可以参看
Rhino -- 基于java的javascript实现
http://www.cnblogs.com/cczw/archive/2012/07/16/2593957.html
分享到:
相关推荐
mac for jdk1.6 jdk6 安装版 里面有两个jdk1.6的安装包,都可以用 如果电脑上安装有1.7,1.8等高版本jdk就不要再下安装包了,安装包安装会报错 命令是这个:brew install java6或 brew install homebrew/cask-...
aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-...
jdk1.6 源码
1.okhttp3.8源码使用jdk1.6重新编译,已集成了okio,在javaweb项目中使用,未在安卓项目中使用 2.okhttp3.8源码使用jdk1.6重新编译_okhttp3.8.0-jdk1.6.jar
jdk1.6集成jjwt的问题
适合okhttp,okio JDK1.6:okhttp3.8.0-jdk1.6.jar JDK1.6+:okhttp-3.12.13.jar;okio-1.15.0.jar 适用于Java开发环境、使用OkHttp调用
支持JDK1.6,并且仅在1.6版本中使用,将URL生成二维码。压缩包内包括源码,是在zxing-zxing-3.3.0基础上做的适配,以支持jdk1.6。
JDK 1.6 JDK 1.6 JDK 1.6 JDK 1.6 JDK 1.6 winxp专用 winxp专用winxp专用winxp专用winxp专用winxp专用
JDK 1.6 绿色版,我想很多人可能都需要,这是分卷4,剩下的分卷地址如下: JDK 1.6 绿色版 2 http://download.csdn.net/source/1502201 JDK 1.6 绿色版 3 http://download.csdn.net/source/1502209 JDK 1.6 绿色版...
解决JDK1.6下的sun的Base64不可用情况。
IBM JDK1.6 安装版
JDK1.6API。java1.6开发文档,最新官网文档。满足java开发需求
ZxingUtil生成二维码适用JDK1.6及以下,自己使用JDK1.6,生成的二维码为彩色
JDK1.6百度云下载,里面有qq号,要是链接失效了,可以找我
Windows JDK 1.6 安装包,解压后直接双击安装,简单易用。 下面是Oracle官网对 Java 的介绍:Oracle Java is the #1 programming language and development platform. It reduces costs, shortens development time...
java jdbc oracle (JDK1.6)驱动
java 官方原版 jdk 1.6
jdk1.6jar jdk1.6.0_39.zip
linux 64位IBM JDK1.6