DANCE WITH JAVA

          開發(fā)出高質(zhì)量的系統(tǒng)

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          好友之家

          最新評(píng)論

          JDK6的新特性之十二:腳本語(yǔ)言支持(Scripting) (轉(zhuǎn)載)

          轉(zhuǎn)載自:http://blog.csdn.net/Chinajash/archive/2007/01/23/1491570.aspx
          JDK6增加了對(duì)腳本語(yǔ)言的支持(JSR 223),原理上是將腳本語(yǔ)言編譯成bytecode,這樣腳本語(yǔ)言也能享用Java平臺(tái)的諸多優(yōu)勢(shì),包括可移植性,安全等,另外,由于現(xiàn)在是編譯成bytecode后再執(zhí)行,所以比原來(lái)邊解釋邊執(zhí)行效率要高很多。加入對(duì)腳本語(yǔ)言的支持后,對(duì)Java語(yǔ)言也提供了以下好處。
          1、許多腳本語(yǔ)言都有動(dòng)態(tài)特性,比如,你不需要用一個(gè)變量之前先聲明它,你可以用一個(gè)變量存放完全不同類型的對(duì)象,你不需要做強(qiáng)制類型轉(zhuǎn)換,因?yàn)檗D(zhuǎn)換都是自動(dòng)的。現(xiàn)在Java語(yǔ)言也可以通過(guò)對(duì)腳本語(yǔ)言的支持間接獲得這種靈活性。
          2、 可以用腳本語(yǔ)言快速開發(fā)產(chǎn)品原型,因?yàn)楝F(xiàn)在可以Edit-Run,而無(wú)需Edit-Compile-Run,當(dāng)然,因?yàn)镴ava有非常好的IDE支持,我 們完全可以在IDE里面編輯源文件,然后點(diǎn)擊運(yùn)行(隱含編譯),以此達(dá)到快速開發(fā)原型的目的,所以這點(diǎn)好處基本上可以忽略。
          3、通過(guò)引入腳本語(yǔ)言可以輕松實(shí)現(xiàn)Java應(yīng)用程序的擴(kuò)展和自定義,我們可以把原來(lái)分布在在Java應(yīng)用程序中的配置邏輯,數(shù)學(xué)表達(dá)式和業(yè)務(wù)規(guī)則提取出來(lái),轉(zhuǎn)用JavaScript來(lái)處理。

          Sun的JDK6實(shí)現(xiàn)包含了一個(gè)基于Mozilla Rhino的 腳本語(yǔ)言引擎,支持JavaScript,這并不是說(shuō)明JDK6只支持JavaScript,任何第三方都可以自己實(shí)現(xiàn)一個(gè)JSR-223兼容的腳本引擎 使得JDK6支持別的腳本語(yǔ)言,比如,你想讓JDK6支持Ruby,那你可以自己按照J(rèn)SR 223的規(guī)范實(shí)現(xiàn)一個(gè)Ruby的腳本引擎類,具體一點(diǎn),你需要實(shí)現(xiàn)javax.script.ScriptEngine(簡(jiǎn)單起見,可以繼承javax.script.AbstractScriptEngine)和javax.script.ScriptEngineFactory兩個(gè)接口。當(dāng)然,在你實(shí)現(xiàn)自己的腳本語(yǔ)言引擎之前,先到scripting.dev.java.net project 這里看看是不是有人已經(jīng)幫你做了工作,這樣你就可以直接拿來(lái)用就行。

          Scripting API

          Scripting API是用于在Java里面編寫腳本語(yǔ)言程序的API, 在Javax.script中可以找到Scripting API,我們就是用這個(gè)API來(lái)編寫JavaScript程序,這個(gè)包里面有一個(gè)ScriptEngineManager類,它是使用Scripting API的入口,ScriptEngineManager可以通過(guò)jar服務(wù)發(fā)現(xiàn)(service discovery)機(jī)制尋找合適的腳本引擎類(ScriptEngine),使用Scripting API的最簡(jiǎn)單方式只需下面三步
          1、創(chuàng)建一個(gè)
          ScriptEngineManager對(duì)象
          2、通過(guò)ScriptEngineManager獲得ScriptEngine對(duì)象
          3、用ScriptEngineeval方法執(zhí)行腳本

          下面是一個(gè)Hello World程序
          /**
          * @author chinajash
          */
          public class HelloScript {
          public static void main(String[] args) throws Exception {
          ScriptEngineManager factory = new ScriptEngineManager();//step 1
          ScriptEngine engine = factory.getEngineByName("JavaScript");//Step 2
          engine.eval("print('Hello, Scripting')");//Step 3
          }
          }
          運(yùn)行上面程序,控制臺(tái)會(huì)輸出
          Hello, Scripting
          上面這個(gè)簡(jiǎn)單的Scripting程序演示了如何在Java里面運(yùn)行腳本語(yǔ)言,除此之外,我們還可以利用Scripting API實(shí)現(xiàn)以下功能
          1、暴露Java對(duì)象為腳本語(yǔ)言的全局變量
          2、在Java中調(diào)用腳本語(yǔ)言的方法
          3、腳本語(yǔ)言可以實(shí)現(xiàn)Java的接口
          4、腳本語(yǔ)言可以像Java一樣使用JDK平臺(tái)下的類
          下面的類演示了以上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對(duì)象為腳本語(yǔ)言的全局變量
          testInvokeScriptMethod(engine);//演示如何在Java中調(diào)用腳本語(yǔ)言的方法
          testScriptInterface(engine);//演示腳本語(yǔ)言如何實(shí)現(xiàn)Java的接口
          testUsingJDKClasses(engine);//演示腳本語(yǔ)言如何使用JDK平臺(tái)下的類
          }

          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是腳本語(yǔ)言里的一個(gè)全局變量,專用于訪問(wèn)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中有一個(gè)命令行工具——jrunscript,你可以在<JDK6_Home>/bin下面找到這個(gè)工具,jrunscript是一個(gè)腳本語(yǔ)言的解釋程序,它獨(dú)立于腳本語(yǔ)言,但默認(rèn)是用JavaScript,我們可以用jrunscript來(lái)測(cè)試自己寫的腳本語(yǔ)言是否正確,下面是一個(gè)在命令行運(yùn)行jrunscript的簡(jiǎn)單例子
          jrunscript
          js>println("Hello,JrunScript");
          Hello,JrunScript
          js>9*8
          72.0
          js>

          posted on 2007-02-25 14:59 dreamstone 閱讀(731) 評(píng)論(0)  編輯  收藏 所屬分類: jdk相關(guān)

          主站蜘蛛池模板: 甘德县| 高邑县| 革吉县| 防城港市| 阿拉尔市| 漳浦县| 池州市| 西城区| 和静县| 曲靖市| 霞浦县| 民和| 封丘县| 社会| 那曲县| 东台市| 绵阳市| 五寨县| 台前县| 台北市| 常熟市| 陆川县| 姚安县| 尚义县| 化德县| 偃师市| 西平县| 耒阳市| 石屏县| 怀化市| 安阳县| 公安县| 固镇县| 林甸县| 辉南县| 元阳县| 柳江县| 铁力市| 精河县| 武陟县| 平山县|