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

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
分享到:
评论

相关推荐

    苹果电脑安装jdk1.6 mac for jdk1.6 jdk6 安装版

    mac for jdk1.6 jdk6 安装版 里面有两个jdk1.6的安装包,都可以用 如果电脑上安装有1.7,1.8等高版本jdk就不要再下安装包了,安装包安装会报错 命令是这个:brew install java6或 brew install homebrew/cask-...

    jdk1.6集成jjwt的问题

    标题中的“jdk1.6集成jjwt的问题”指的是在Java Development Kit (JDK) 版本1.6的环境下,尝试整合JSON Web Token (JWT) 库jjwt时遇到的挑战。JWT是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 ...

    okhttp3.8源码使用jdk1.6重新编译_okhttp3.8.0-jdk1.6.zip

    1.okhttp3.8源码使用jdk1.6重新编译,已集成了okio,在javaweb项目中使用,未在安卓项目中使用 2.okhttp3.8源码使用jdk1.6重新编译_okhttp3.8.0-jdk1.6.jar

    JDK1.6版本下载

    10. **Java EE集成**:JDK 1.6对Java企业版(Java EE)的集成有了更好的支持,使得开发Web应用和企业级应用更为便捷。 总的来说,JDK 1.6在提升开发效率、运行性能以及安全性等方面都有显著的进步,是Java发展历程...

    aspose-words-15.8.0-jdk1.6

    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压缩包,下载即用

    - **改进的脚本支持**:添加了对JavaScript和其他脚本语言的支持。 **3. 安装与配置** - **下载**:从Oracle官网或其他可信源下载JDK 1.6的安装文件,如"jdk1.6.exe"。 - **安装**:双击执行安装文件,按照向导步骤...

    JDK1.6百度云下载

    5. **脚本引擎支持**:通过`javax.script`包支持脚本语言的嵌入式执行,方便开发者编写混合Java和其他脚本语言的应用程序。 ### 三、JDK1.6的下载与安装 #### 下载方式 - **官方渠道**:通常推荐从Oracle官方网站...

    okhttp3.8.0-jdk1.6.zip

    总的来说,OkHttp3.8.0-jdk1.6.zip的发布,不仅满足了低版本JDK用户的需求,也体现了开发者对旧有技术栈的持续支持,体现了技术的包容性和持久性。在实际项目中,开发者只需简单引入这两个jar文件,就可以充分利用...

    jdk1.6 解压版-windows

    - **JSR 292**:支持动态语言,引入了invokedynamic指令,使得Java平台更适合脚本语言。 总的来说,JDK1.6是Java开发的重要里程碑,虽然现在已经有了更新的版本,但对于某些老项目或者特定环境,JDK1.6仍然是必要的...

    jdk1.6jar包

    3. **安全性强化**:JDK 1.6引入了更多安全特性,比如改进的证书管理,加强了对加密算法的支持,以及增强了网络通信的安全性。 4. **NIO.2 (New I/O)**:提供了新的文件系统API,支持异步I/O操作,提高了文件操作的...

    jdk1.6 32位免安装纯绿色版

    值得注意的是,虽然JDK 1.6已经比较老旧,许多现代的Java应用和框架可能不再支持这个版本,开发者通常会被建议使用更新的JDK版本,例如JDK 8或更高。然而,在某些特殊情况下,如旧项目维护或与特定版本的软件兼容性...

    jdk1.6解压版(免安装版)

    它在2006年发布,引入了许多新特性,包括改进的垃圾回收算法、更好的性能优化、增强的Swing组件、新的XML处理API(如JAXB 2.0)以及对JavaScript的支持(通过 Rhino 引擎)。对于开发者来说,JDK1.6提供了一个稳定的...

    zxing jar包,支持jdk1.6,包括源码

    这个jar包特别针对JDK1.6进行了优化和适配,确保在该版本的Java环境中能够正常运行。ZXing库广泛应用于移动设备和服务器端,允许程序生成和读取多种类型的条形码和二维码,如QR Code、Aztec、Code 39、EAN-13等。 1...

    jdk 1.6 64位

    8. **国际化和本地化**:JDK 1.6在处理全球化和本地化方面做了很多改进,支持更多的语言和地区设置。 9. **Java Web Start和Applet的增强**:提高了Java Web Start应用程序和Applet的启动速度,同时增强了安全性和...

    解决JDK1.6下的Base64报错问题

    在资源文件中的`解决JDK1.6下的Base64.jar`可能是包含了一个兼容JDK 1.6的Base64实现的第三方库,你可以直接将这个jar包添加到你的项目类路径中,这样就可以使用其中提供的Base64类而无需修改代码。添加方法通常包括...

    jdk1.5 jdk1.6 反编译 工具

    标题中的“jdk1.5 jdk1.6 反编译 工具”指的是用于对Java字节码进行反编译的软件,这类工具能够将Java的.class文件转换回可读的.java源代码形式,这对于理解和学习已有的Java类库或者进行逆向工程非常有帮助。...

    如何解决JDK1.6下的Base64

    提供的压缩包文件"解决JDK1.6下的Base64.txt"可能包含了如何集成和使用这些第三方库的详细步骤,或者可能是自定义的Base64实现。在实际应用中,你需要根据文件内容来调整你的项目配置。 总的来说,尽管JDK 1.6没有...

    jdk1.6解决base64

    这意味着它们并不被官方文档所支持,并且可能会随着JDK版本的升级而发生变化或者移除。因此,在JDK 1.6下使用这些类时可能会遇到兼容性问题,比如编译错误或者运行时异常等。 #### 解决方案 为了解决这个问题,可以...

    okhttp包含okio(亲测可在jdk1.6环境运行)

    适合okhttp,okio JDK1.6:okhttp3.8.0-jdk1.6.jar JDK1.6+:okhttp-3.12.13.jar;okio-1.15.0.jar 适用于Java开发环境、使用OkHttp调用

    IBMJDK1.6linux.zip

    IBM JDK 1.6是IBM公司为Java开发者提供的一个针对Linux 64位操作系统的Java开发工具包。这个版本的JDK是Java平台标准版(Java SE)的一部分,主要用于开发和运行Java应用程序、Web应用程序以及企业级应用。IBM JDK与...

Global site tag (gtag.js) - Google Analytics