`
gladmustang
  • 浏览: 7765 次
社区版块
存档分类
最新评论

JDK1.6对脚本语言的支持(Mozilla Rhino)

    博客分类:
  • 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(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
分享到:
评论

相关推荐

    Mozilla Rhino rhino1_7R5.zip

    java中执行javascript脚本需要用到的引擎工具,jdk1.6已自带,但1.5及以下还是需要的

    Mozilla Rhino 介绍

    - **对JavaScript 1.5的全面支持**:Rhino提供了完整的JavaScript 1.5语言特性的支持。 - **在Java中直接使用JavaScript**:可以在Java程序中嵌入JavaScript代码,从而增强应用程序的功能性和灵活性。 - **...

    rhino-1.7.7.1

    Rhino 是一种使用 Java 语言编写的 JavaScript 的开源实现,原先由Mozilla开发,现在被集成进入JDK 6.0。与其他很多语言一样,Rhino 是一种动态类型的、基于对象的脚本语言,它可以简单地访问各种 Java 类库。Rhino ...

    java脚本引擎.pdf

    自JDK 6.0起,Java脚本引擎成为Java SE的一部分,它的出现极大地扩展了Java语言的功能,使之不再局限于编译型语言的范畴,而是能够在运行时动态地执行脚本代码。 Java脚本引擎的关键优势在于它提供了一套标准化的...

    Java SE 6: Top 10 Features

    **动机**:引入脚本支持的主要动机是让开发者能够在单一应用中利用不同语言的特点,同时通过强大的Java库扩展脚本语言的功能。这不仅提高了开发效率,还使得最终用户能够通过脚本来定制Java应用程序,从而创建更实用...

    HTML浏览器

    Rhino是Mozilla的一个开源项目,它提供了一个纯Java的JavaScript解释器。Nashorn是Oracle JDK的一部分,提供更快的JavaScript执行速度,允许Java和JavaScript之间进行无缝交互。 在构建HTML浏览器时,开发者还需要...

    jsjava_1_0资源包

    4. ** Rhino和 Nashorn JavaScript引擎**:Rhino是Mozilla开发的一个JavaScript引擎,它可以嵌入到Java应用中,允许Java直接执行JavaScript代码。Nashorn是JDK 8引入的JavaScript引擎,它提供了更高效的JavaScript...

    java_run_js.rar_run_run java script

    Rhino是由Mozilla开发的一个开源JavaScript引擎,它允许Java程序直接执行JavaScript代码。Nashorn引擎则是JDK 8引入的新特性,它提供了一个更快速、更现代的JavaScript执行环境,不过在JDK 11中已经被弃用。 本示例...

Global site tag (gtag.js) - Google Analytics