服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > JDK > 查看文档

jdk6的新特性:脚本语言支持(scripting)

概述

-----------------------------
    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>

扫描关注微信公众号